美文网首页
排序算法(三)折半插入排序算法

排序算法(三)折半插入排序算法

作者: ChooAcc | 来源:发表于2019-03-20 12:45 被阅读0次

排序算法(三)折半插入排序算法

1.基本概念
  折半插入排序(Binary-Insertion-Sort)是对插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度。

2.算法思路
因为在一个有序序列中查找一个插入位置,所以可使用二分查找,减少元素比较次数提高效率。
  1.先取出预插入的数,通过二分查找法找到插入位置(insert_index)。
  2.再进行插入排序,直到预插入数插入到插入位置(insert_index)即可。
  重复1、2步,直到遍历完所有数。

3.代码实现

    private void binaryInsertionSort() {
        int[] numbers = {54, 32, 66, 8, 1, 6, 77, 69, 19};
        for (int i = 1; i < numbers.length; i++) {
            // 获取插入位置
            int insert_index = binarySearch(numbers, i, numbers[i]);
            // 当 insert_index = -1 时,不必做插入操作
            if (insert_index != -1) {
                // 一下是插入排序
                int temp = numbers[i];
                int j = i - 1;
                while (j >= insert_index) {
                    numbers[j + 1] = numbers[j];
                    j--;
                }
                numbers[j + 1] = temp;
            }
        }
    }

    /**
     * 二分查找法
     * @param numbers 数据数组
     * @param n 预插入数再数组中的下标
     * @param value 预插入数
     * @return 插入位置,找不到插入位置时返回-1,说明预插入数已经与之前的数列形成有序序列
     */
    private int binarySearch(int[] numbers, int n, int value) {
        int left = 0;
        int right = n - 1;
        while (left <= right) {
            int middle = (left + right) /2;
            if (value <= numbers[middle]) {
                right = middle - 1;
            } else if (value > numbers[middle]) {
                left = middle + 1;
            }
        }
        // 当 left >= n 时,则说明预插入数与其之前的有序序列
        // 已经形成有序序列了,因此不需要做插入操作
        return (left < n) ? left : -1;
    }

4.总结
  折半插入排序算法是一种稳定的排序算法,比直接插入算法明显减少了关键字之间比较的次数,因此速度比直接插入排序算法快,折半查找只是减少了比较次数,但是元素的移动次数不变,所以算法的时间复杂度仍然为O(n^2)。

相关文章

  • 排序算法(三)折半插入排序算法

    排序算法(三)折半插入排序算法 1.基本概念  折半插入排序(Binary-Insertion-Sort)是对插入...

  • 数据结构&算法(一)

    一、Java实现快速排序算法 二、Java实现折半插入排序算法 三、Java实现冒泡排序算法

  • 插入排序之折半插入排序

    基本思路:折半插入排序(binary insertion sort)是对插入排序算法的一种改进,由于排序算法过程中...

  • 常用的排序算法

    常用的排序算法 常用的排序算法插入排序折半插入排序shell 排序冒泡排序选择排序快速排序基数排序归并排序堆排序K...

  • 5分钟了解折半插入排序

    5分钟了解折半插入排序 前言 折半插入排序(Binary Insertion Sort)是对直接插入排序算法的一种...

  • 【数据结构】【C#】014-插入类排序:🥈折半插入排序(稳定)

    插入排序:折半插入排序(稳定) 【 算法思想 】 从关于查找的讨论中可知,对于有序表进行折半查找,其性能优于顺序查...

  • 十大排序算法

    十大排序算法 1.插入排序 2.折半插入排序算法 3.选择排序 4.冒泡排序 5.谢尔排序 6.快速排序 7.堆积...

  • Java学习记录(常用 算法 排序 )

    排序算法的分类如下: 1.插入排序(直接插入排序、折半插入排序、希尔排序);2.交换排序(冒泡泡排序、快速排序);...

  • 排序——插入排序

    业精于勤荒于嬉 插入排序包括:直接插入排序、折半插入排序、希尔排序(缩小增量排序) 一、直接插入排序 1. 算法思...

  • 算法-插入排序

    算 法:插入排序算法时间复杂度: 插入排序算法描述 插入排序伪代码 插入排序实现 插入排序算法概述 插入排...

网友评论

      本文标题:排序算法(三)折半插入排序算法

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