带二分查找的插入排序要借助3个游标,low mid high来确定temp这个要插入的新元素的位置,在low<=high时循环,在mid>temp的时候就说明temp在mid的左边,即把high改成mid,因为mid此时一定大于temp,所以进行优化将high改为mid-1,反之,就将low改为mid+1.通过循环可以得到新元素的位置是high+1.将a[high+1]=temp赋值。并将[high+1,i]区间的所有元素往后移一个位置.代码实现如下:
package cn.hncu.sorts;
public class SortWay2 {
//输出函数
private static void print(int[] a) {
for(int num:a){
System.out.print(num+" ");
}
System.out.println();
}
//结合二分的插入排序
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;
//在low和high之间的区域进行二分查找,找到新插入的元素位置
while(low<=high){
mid=(low+high)/2;
if(a[mid]>temp){
high=mid-1;
}else{
low=mid+1;
}
}
//经过上面的二分查找,得到新元素的位置是:high+1
//把[high+1,i]区间内的所有元素往后移一个位置
for (int j = i; j > high; j--) {
a[j+1]=a[j];
}
a[high+1]=temp;
}
}
public static void main(String[] args) {
int[] a={21,22,5,7,86,57,9,-2,37,-8};
//结合二分的插入排序
insertSort2(a);
print(a);
}
}