05折半插入排序

47 阅读1分钟

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;
        }
    }