二分法插入排序


直接插入排序和二分法插入排序的区别。

  • 相同之处:

插入第i个元素时, 前i-1个元素已经是有序的

  • 不同之处:

直接插入排序在寻找子数组(前i-1个元素组成的有序数组)中的插入位置时,是拿待插入的元素和子数组里的元素按顺序从左到右或从右到左一个一个比较来确定待插入的位置。

二分法插入排序是拿待插入元素和有序子数组中间位置的元素比较,以当前的中间位置为分界点来确定待插入元素在该分界点的左边还是右边, 如果在左边, 就把分界点左边的元素序列当作下一次的要寻找的子数组(不包括中间元素)。 如果在右边, 就把分界点右边的元素序列当作下一次的要寻找的子数组(不包括中间元素)。重复上述过程直到子数组的长度小于1查找结束。


/**
 * 二分法插入排序
 *
 */
public class BinaryInsertSort {

    public void binaryInsertSort(int[] array) {

        for (int i = 1; i < array.length; i++) {
            int temp = array[i];    // 待插入的元素
            int left = 0;           // 已有序序列的起始下标
            int right = i - 1;      // 已有序序列的结束下标
            int middle = 0;         // 已有序序列的中间下标
            // 利用二分法寻找插入位置
            while (left <= right) { 
                middle = (left + right) / 2;
                if (temp > array[middle]) {
                    left = middle + 1;
                } else {
                    right = middle - 1;
                }
            }
            // 找到了元素的插入位置, 把下标从left开始往后的所有元素后移一位(包括left位置的元素)
            for(int j = i - 1; j >= left; j--) {
                array[j + 1] = array[j];
            }
            
            // 待插入的元素归位
            if(i != left) {
                array[left] = temp;
            }
        }
        display(array);
    }

    public void display(int[] array) {
        for(int x: array) {
            System.out.print(x + " ");
        }
    }
    
    public static void main(String[] args) {
        int[] array = {1,3,4,3,8,3,2,6,7,4,9,10,0,-1,-7,4,2,9,7,20};
        BinaryInsertSort insertSort = new BinaryInsertSort();
        insertSort.binaryInsertSort(array);
        //结果: -7 -1 0 1 2 2 3 3 3 4 4 4 6 7 7 8 9 9 10 20 
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 大写的转 目录 [冒泡排序][鸡尾酒排序] [选择排序] [插入排序][二分插入排序][希尔排序] [归并排序] ...
    Solang阅读 5,755评论 0 16
  • 概述 因为健忘,加上对各种排序算法理解不深刻,过段时间面对排序就蒙了。所以决定对我们常见的这几种排序算法进行统一总...
    清风之心阅读 4,062评论 0 1
  • 昨夜,婧婧翻看空间,看到我之前的几篇日志,有些触动情绪。我俩毕业后偶有几句闲聊,远去哈佛医学院的她,和成为一名朝阳...
    鱼冬眠阅读 1,711评论 0 1
  • 在一周进步的公众号里看到一篇文章《“我讨厌我的专业。”》。这篇文章从常见的人们抱怨自己入错了行开始,介绍如何培养自...
    打嗝海狸阅读 1,796评论 0 1
  • 落雁伴暮枝头鸣 鸳鸯嬉戏湖光中 绿波微荡轻舟出 青山无语夕阳松
    esir李阅读 1,301评论 0 0

友情链接更多精彩内容