第一種實現方式:(本人一開始對cin的使用不是很熟悉,看了一些人得博客詳解後纔有了第一種方式的實現,本身都被驚訝到了so easy:題目在下面)php
// // main.cpp // BinaryInsertSort // // Created by Jason on 16/9/28. // Copyright © 2016年 Jason. All rights reserved. // #include <iostream> using namespace std; //折半插入排序-算法 void BinaryInsertSort(int R[],int n ) { int i,j,mid,low,high,temp; for(i=2; i<=n; ++i) { R[0] = R[i]; low = 1; high = i-1; while(low <= high) { mid = (low + high) / 2; if(temp > R[mid]) { low = mid + 1; }else{ high = mid - 1; } } for(j=i-1; j>=high+1; --j) { R[j+1] = R[j]; } R[high+1] = R[0]; } } int main(int argc, const char * argv[]) { int n; int i = 0; cin>>n; if(n<=1000&&n>=1) { int R[n]; int b; while(i<n&&cin>>b) { R[i] = b; i++; } BinaryInsertSort(R,n); for(int j=0; j<n; ++j) { cout << R[j] <<" "; } cout << endl; } return 0; }
第二種實現方式ios
// main.cpp // ACM_1775 // Created by Jason on 16/9/27. // Copyright © 2016年 Jason. All rights reserved. /** ACM題目: 地址:http://arena.acmclub.com/problem.php?id=1775 輸入 輸入的第一行包含1個正整數n,表示共有n個整數須要參與排序。其中n不超過1000。 第二行包含n個用空格隔開的正整數,表示n個須要排序的整數。 輸出 只有1行,包含n個整數,表示從小到大排序完畢的全部整數。 請在每一個整數後輸出一個空格,並請注意行尾輸出換行。 樣例輸入 10 2 8 4 6 1 10 7 3 5 9 樣例輸出 1 2 3 4 5 6 7 8 9 10 提示 在本題中,須要按照題目描述中的算法完成折半插入排序的算法。與直接插入排序算法不一樣,折半插入排序算法在查找插入位置時採用了折半查找的方案,減小了關鍵字之間的比較次數,可是記錄的移動次數並無發生改變,所以折半插入排序的時間複雜度依舊爲O(n2),一樣不是一種很是高效的排序方法。 **/ #include <iostream> #include <sstream>//包含串流輸入輸入類 #include <string> using namespace std; //折半插入算法 void BinaryInsertSort(int R[],int n ) { int i,j,mid,low,high,temp; for(i=1; i<n; ++i) { temp = R[i]; low = 0; high = i; while(low <= high) { mid = (low + high) / 2; if(temp > R[mid]) { low = mid + 1; }else{ high = mid - 1; } } for(j=i-1; j>=low; --j) { R[j+1] = R[j]; } R[low] = temp; } } int main(int argc, const char * argv[]) { int k = 0; int n; cin>>n; int R[n]; /** 問題:下面的getline(cin,m)無法鍵盤輸入,直接跳過 解決:因爲在寫getline()函數以前,使用過了回車 (不論你輸入的是字符,數字或是回車,空格符,getline()函數都接收) 而cin>>這種輸入方式倒是忽略回車的,若是你在getline()以前cin的一個數,回車被cin忽略了,卻被getline函數接收了,感受就是這條語句被跳過了 因此解決的辦法是在getline函數以前再使用getline一次,將輸入流裏的回車符接收掉,後面就能正常輸入了 **/ if (n<=1000&&n>=1) { string m; /** getline 函數不是c庫函數而是C++庫函數, getline函數是一個比較常見的函數。根據它的名字咱們就能夠知道這個函數是來完成讀入一行數據的 C++中定義了一個在std名字空間的全局函數,由於這個getline函數的參數使用了string字符串,因此聲明在了<string>頭文件中了。 **/ getline(cin, m); getline(cin, m); /** C++引入了ostringstream、istringstream、stringstream這三個類,要使用他們建立對象就必須包含<sstream>這個頭文件。 istringstream類用於執行C++風格的串流的輸入操做。 ostringstream類用於執行C風格的串流的輸出操做。 strstream類同時能夠支持C風格的串流的輸入輸出操做。 istringstream的構造函數原形以下: istringstream::istringstream(string str); 它的做用是從string對象str中讀取字符。 getline()的原型是istream& getline ( istream &is , string &str , char delim ); 其中 istream &is 表示一個輸入流,譬如cin;string&str表示把從輸入流讀入的字符串存放在這個字符串中(能夠本身隨便命名,str什麼的均可以); char delim表示遇到這個字符中止讀入,在不設置的狀況下系統默認該字符爲'\n',也就是回車換行符(遇到回車中止讀入) **/ istringstream is(m); int number; while(is>>number) { R[k] = number; k++; } BinaryInsertSort(R,n); for(int j=0; j<n; ++j) { cout << R[j] <<" "; } cout << endl; } }