Fork me on GitHub

# binaryInsertsort 折半插入排序

折半插入解析(binary insert sort)

1. 基本描述

​ 基于直接插入排序。在此基础上只是改进了搜索机制。

### 	区别

直接插入排序 是从右侧基于前面是有序数组的思维去判断。一边寻找,一边从右往左,k+1=k形式 去替换

折半插入排序 是设置了low 和 high 两个参数,去所有在前面有序数组。利用折半查找找到对应位置。 在去做循环替换。

​ 稳定性 稳定

​ 时间复杂度
$$
O(n^2)
$$
​ 空间复杂度
$$
O(1)
$$

2.low high 机制

​ low 一开始等于0 ,high 则为 i-1。每次都是去更新low,或者high

​ 问题出现在结果,由于是除二,除了开始 0,是得不到长度为 2 的数组。其余都能找长度为2的数组,在最后。然后再去除,最后low = high =mid ,长度为一的数组。。

​ 同样,需要注意的是最后low high 结果去表示 插入位置,这边是采用low,其实high也可以。由于机制是

 while (low <= high) {
                int mid = (low + high) / 2;
                if (temp < array[mid]) {
                    high = mid - 1;
                } else
                    low = mid + 1;
            }

​ 所以在最后low=mid(数组位置除二),如果temp是大于mid,low+1。low=low+1就是插入位置.如果temp小于mid。low 不变。high-1。表示的是 low 就是插入位置。

​ 接下来很简单了,low=low+1 或者low=low。 就是应该插入的位置。

​ 和直接插入排序一样,往右边移动即可。关键是参数设置的不同。本质上一样

 for (int j = i; j >= low + 1; j--)
                    array[j] = array[j - 1];
                array[low] = temp;

3.代码

public class BinaryInsertSort {
    public static void BinaryinsertSort(int array[]) {
//        int i, j, k;
        for (int i = 1; i < array.length; i++) {
            int temp = array[i];
            int low = 0;
            int high = i - 1;
            while (low <= high) {
                int mid = (low + high) / 2;
                if (temp < array[mid]) {
                    high = mid - 1;
                } else
                    low = mid + 1;
            }
                for (int j = i; j >= low + 1; j--)
                    array[j] = array[j - 1];
                array[low] = temp;
            }
        }



    public static void main(String[] args) {
        int[] array = {1, 2, 3, 0};
        BinaryinsertSort(array);
        for (int i : array
        ) {
            System.out.println(i);
        }
        System.out.println(array);
    }
}

posted @ 2019-07-05 11:14  EsMussSeinHui  阅读(196)  评论(0编辑  收藏  举报