折半插入排序思想和直接插入排序类似。
1)找到插入位置;
2)依次后移正确位置及后面的元素。
区别是查找插入位置的方法不同。
折半插入排序使用的折半查找法在一个已经有序的序列中找到查找位置。
注意,折半查找法的一个基本条件就是序列已经有序。
直接上代码:
#include<iostream> using namespace std; void binaryInsertionSort(int arr[],int n){ int mid; for(int i=1;i<n;i++){ int low=0,high=i-1;//将要插入的元素复制出来 int temp=arr[i]; //当low>high时,证明折半查找结束 while(low<=high){ mid=(low+high)/2; //每次和折半查到的元素比较大小 //当待插入元素比折半查到的元素小时,那么正确插入位置在低半区;否则在高半区 if(arr[i]<arr[mid]) high=mid-1; else low=mid+1; } //由折半查找到的正确插入位置为high+1 //将high+1后面的元素依次后移 for(int j=i-1;j>=high+1;j--) arr[j+1]=arr[j]; //在正确位置插入复制出来的待插入元素 arr[high+1]=temp; } } int main(){ int a[10]={10,9,8,7,6,5,4,3,2,1}; binaryInsertionSort(a,10); for(int i=0;i<10;i++){ cout<<a[i]<<" "; } cout<<endl; return 0; }