美文网首页
二分排序法

二分排序法

作者: CircleLee | 来源:发表于2019-04-20 11:12 被阅读0次

二分排序法,实际上是二分查找法+直接插入排序法的灵活组合。

先来看看二分查找法,二分查找法的前提是给出的队列是有序的,通过不断的折半查找,找到指定key对应的数组位置。

//二分查找法
public static int BinarySearch(int[] list, int key) {
    int mid = (list.length - 1) / 2;
    if (list[mid] == key) {
        return mid;
    }

    int left = 0;
    int right = list.length - 1;
    
    //while条件是小于等于
    while (left <= right) {
        //勿漏加left,没有加left,当key在折半右边时,会出错
        mid = (right - left) / 2 + left;
        if (key > list[mid]) {
            left = mid + 1;
        } else if (key < list[mid]) {
            right = mid - 1;
        } else {
            return mid;
        }
    }
    return -1;
}

我们再来看看直接插入法

//直接插入排序法
public static void insertSort(int[] list) {
    int temp;
    int j;
    for (int i=0; i<list.length; i++) {
        temp = list[i];

        for (j=i-1; j>=0 && list[j]>temp; j--) {
            list[j+1] = list[j];
        }
        //注意:temp赋值给j+1,不是j。for循环特性
        list[j+1] = temp;
    }
}

直接插入法的最大特点是在第i个数之前的数组都是有序的,我们可以利用二分查找法提高直接插入排序的效率

//二分查找排序法
public static void binaryInsertSort(int[] list) {
    int temp, j, mid;
    for (int i=0; i<list.length; i++) {
        temp = list[i];
        //把temp当成key,利用二分查找法,找到temp需要插入的位置
        int left = 0;
        int right = i - 1; //取i之前的数组

        while (left <= right) {
            mid = (right - left)/2 + left;

            if (temp > list[mid]) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        //通过二分查找法找到temp需要插入的位置left。
        for(j=i-1; j>=left; j--) {
            list[j+1] = list[j];
        }
        //把temp 赋值给left的位置
        list[left] = temp;
    }
}

相关文章

网友评论

      本文标题:二分排序法

      本文链接:https://www.haomeiwen.com/subject/xqufbqtx.html