2.3.6在插入排序中使用二分查找
//不考虑空数组或者单元素数组的排序情况
for(int j=1;j<i.length;j++){
int key=i[j];
int high=j-1;
int low=0;
int mid=(low+high)/2;
//记录是中途退出还是循环到底的标志位
int flag=0;
while (low<high){
mid=(low+high)/2;
if (key==i[mid]){flag=1;break;}
else if (key<i[mid]) {high=mid-1;}
else if (key>i[mid]) {low=mid+1;}
}
//数组的移位起始点下标
int move;
if (flag==1) move=mid;
//如果是循环退出则需要比较重叠时候的值确定数组的移位起始
else {
if (key < i[low]) move = low;
else move = low + 1;
}
for(int k=j-1;k>=move;k--){
i[k+1]=i[k];
}
i[move]=key;
}
该算法虽然二分查找复杂度为 log 2 n \log_2^n log2n但两层循环仍然保持了插入排序的 n 2 n^2 n2的复杂度,如果使用链表形式可以得到低复杂度