对于插入排序,如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的次数
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=10;
int n,a[maxn];
void insertionsortdichotomy()
{
for(int i=1;i<n;i++){
int get=a[i];
//进行二分查找
int left=0;
int right=i-1;
while(left<=right){
int mid=(left+right)>>1;
if(a[mid]>get){
right=mid-1;
}else{
left=mid+1;
}
}
for(int j=i-1;j>=left;j--){
a[j+1]=a[j];
}
a[left]=get;
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
insertionsortdichotomy();
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
cout<<endl;
return 0;
}
当n较大时,二分插入排序的比较次数比直接插入排序的最差情况好得多,但是比直接插入排序的最好情况要差,所以当元素初始序列已经接近升序时,直接插入排序比二分插入排序比较次数少,二分插入元素移动与直接插入排序相同,依赖于元素初始化序列。