对于插入排序,如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的次数,我们称为二分插入排序
算法描述:
在直接插入排序的基础上,利用二分(折半)查找算法决策出当前元素所要插入的位置。
二分查找:
1.找到中间元素,如果中间元素比当前元素大,则当前元素要插入到中间元素的左侧;
2.否则,中间元素比当前元素小,则当前元素要插入到中间元素的右侧。
3.找到当前元素的插入位置 i 之后,把 i 和 high 之间的元素从后往前依次后移一个位置,然后再把当前元素放入位置 i。
代码
private static void insertSort2(int[] a) {
for(int i=0;i<a.length-1;i++){
int temp = a[i+1];
int low = 0;
int high = i;
int mid;
while(low<=high) {
mid = (low+high)/2;
if (a[mid]>temp) {
high = mid-1;
}else{
low = mid+1;
}
}
for(int j=i;j>=high+1;j--){
a[j+1]=a[j];
}
a[high+1]=temp;
}
}