常见插入排序算法的实现(直接插入排序与希尔排序)

目录

直接插入排序

直接插入排序的特性总结:

希尔排序(缩小增量排序)

希尔排序的特性总结:


插入排序的实现有许多,所以在这篇文章主要介绍,两种比较主流的插入排序实现。

直接插入排序

概括 :直接插入排序是一种简单的插入排序法,其基本思想是: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到 一个新的有序序列 。实际中我们玩扑克牌时,就用了插入排序的思想。直接插入排序是一种简单的插入排序法,其基本思想是: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到 一个新的有序序列 。实际中我们玩扑克牌时,就用了插入排序的思想。

插入原理:当插入第i(i>=1)个元素时,前面的array[0],array[1],...,array[i-1]已经排好序,此时用array[i]的排序码与array[i1],array[i-2],...的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移

排序演示

代码实现:

复制代码
public void insertSort( int [] arr){
    for (int i = 1; i < arr.length; i++) {
        int tmp = arr[i];
        int j = i-1;
        for(;j >= 0 ; j--){
            if(tmp < arr[j]){
                arr[j+1] = arr[j];
            }else {
                break;
            }
        }
        arr[j+1] = tmp;
    }
}

直接插入排序的特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高

  2. 时间复杂度:O(N^2)

  3. 空间复杂度:O(1),它是一种稳定的排序算法

  4. 稳定性:稳定

希尔排序(缩小增量排序)

希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成多个组, 所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达x=1时,所有记录在统一组内排好序。

希尔排序与直接插入排序的关系:希尔排序可以说是对直接插入排序的优化,可以想象一下,如果是一个非常大数组且元素顺序混乱,如果直接使用插入排序的效率会非常低效,因为直接插入排序,非常受元素顺序的影响,元素顺序越有序,效率越高,反之,越低。

因此希尔排序的缩小增量法,有效优化了直接插入排序的缺点。

代码实现:

复制代码
public void sherSort(int[] arr , int gap){

    for (int i = gap; i < arr.length; i+= gap) {

        int tmp = arr[i];

        int j = i-gap;

        for(;j >= 0 ; j-= gap){

            if(tmp < arr[j]){

                arr[j+gap] = arr[j];

            }else {

                break;

            }

        }

        arr[j+gap] = tmp;

    }

    if (gap > 1){

        sherSort(arr ,gap/2);

    }

}

希尔排序的特性总结:

  1. 希尔排序是对直接插入排序的优化。

  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很 快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。

  3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排 序的时间复杂度都不固定:

相关推荐
皮皮林5516 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河6 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
地平线开发者7 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮7 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者8 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考8 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
桦说编程9 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅11 小时前
Java面向对象入门(类与对象,新手秒懂)
java
HXhlx11 小时前
CART决策树基本原理
算法·机器学习