05折半插入排序
基本思想:将直接插入排序的位置查找改为二分查找。
讲解:
//创建一个名为Binsety_sort的方法,传递参数为待排序数组及其大小
public static void Binsert_sort(int a[],int len){
//外循环是将后1 ~ len个元素依次插入到前方
for(int i = 1;i < len;i++){
//temp记录当前的元素值,low为左边界0,high为右边界
//low和high组成的区间为已排序区间
int temp = a[i],low = 0,high = i - 1;
//内层while循环寻找插入位置,只要左边界low一直小于右边界high
while(low <= high){
//保存当前区间的中间位置
int mid = (low + high) / 2;
//判断当前元素temp和该区间中间元素的大小关系
//若是小于
if(temp < a[mid]){
//则让右边界high为mid - 1
high = mid - 1;
//若是大于
}else{
则让左边界low为mid + 1
low = mid + 1;
}
}
//当我们跳出while循环后, 此时的low值就是我们将要插入的位置
//遍历i ~ low所有元素向后移
for(int j = i;j >= low;j--){
a[j] = a[j-1];
}
//最后空出的位置,即low的位置为插入位置,插入temp
a[low] = temp;
}
}