算法描述
 与直接插入排序算法相比,折半插入排序算法只是将寻找插入位置这一过程进行了优化,采用折半查找法能更快找到待插入位置。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
   |  #include <iostream> #include <fstream> using namespace std;
  const int n = 8;
 
 
 
 
  int binary_search(int arr[], int low, int high, int key){     if(low > high) return low;      int mid = (low + high) / 2;     if(arr[mid] > key)         return binary_search(arr, low, mid-1, key);     if(arr[mid] < key)         return binary_search(arr, mid+1, high, key); }
  void binary_insert_sort(int arr[], int i){     int elem = arr[i];     int j = binary_search(arr, 0, i-1, elem);     for(int k=i; k>j; --k)         arr[k] = arr[k-1];     arr[j] = elem; }
  int main(){     ifstream inFile;     inFile.open("in.txt");     int *arr = new int[n];     for(int i=0; i<n; ++i)         inFile >> arr[i];     for(int i=0; i<n; ++i)         binary_insert_sort(arr, i);     for(int i=0; i<n; ++i)         cout << arr[i] << " ";     inFile.close();     delete[] arr;     return 0; }
 
  | 
 
算法分析
 (1)折半查找法提高了查找效率,直接插入排序需要查找O(n2)次,折半查找法只需查找O(nlogn)次;但是移动次数仍为O(n2)次,因此算法复杂度仍为O(n2)。
 (2)折半插入排序为稳定的排序算法。
转载请注明来源:©Tinshine