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

目录

直接插入排序

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

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

希尔排序的特性总结:


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

直接插入排序

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

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

排序演示

代码实现:

复制代码
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的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排 序的时间复杂度都不固定:

相关推荐
小Ti客栈3 小时前
Spring Boot 集成 Springdoc-OpenAPI 与 Knife4j实现接口文档与可视化调试
java·spring boot·后端
徐小夕3 小时前
花了一周,3亿tokens,我开源了一款 Word 文档智能审查平台,文稿自动质检+可视化分析,告别低效人工审核
前端·算法·github
Ai拆代码的曹操4 小时前
Spring 事务 REQUIRES_NEW 嵌套调用:连接池翻倍的秘密
java·后端·spring
动恰客流统计4 小时前
ReID边缘计算视觉统计:餐饮店客流增长的数字化破局路径
java·大数据·运维·人工智能
可编程芯片开发4 小时前
UPFC统一潮流控制器的simulink建模与仿真
算法
Ivanqhz5 小时前
Rust &‘static str浅析
java·前端·javascript·rust
小小仙子5 小时前
矢量网络分析仪如何测试S参数的?
人工智能·算法·机器学习
中微极客7 小时前
降维算法75倍加速:从PCA到稀疏字典学习的工程实践
人工智能·学习·算法
storyseek7 小时前
前缀和实现Kogge-Stone算法
数据结构·算法