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

目录

直接插入排序

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

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

希尔排序的特性总结:


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

直接插入排序

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

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

相关推荐
lulu121654407812 分钟前
OpenRouter Fusion 多模型融合架构深度拆解:预算级模型组团打平 Fable 5,多模型协作才是 AGI 的正确打开方式?
java·人工智能·架构·ai编程·agi
雨辰AI17 分钟前
生产级实测:SpringBoot3 + 达梦数据库接口从 200ms 优化至 20ms 完整调优指南
java·数据库·spring boot·后端·政务
林间码客28 分钟前
04 ROC曲线与AUC:从零开始手动计算
大数据·人工智能·算法
Irissgwe32 分钟前
map/set/multimap/multiset 的底层逻辑与实现
数据结构·c++·算法·二叉树·stl·c·红黑树
IronMurphy36 分钟前
【算法五十八】23. 合并 K 个升序链表
数据结构·算法·链表
思茂信息43 分钟前
CST软件基于液态金属开关的方向图可重构天线
服务器·算法·重构·cst·仿真软件·电磁仿真
(Charon)1 小时前
【C++ 面试高频:内存管理、RAII 和智能指针详解】
java·开发语言·word
凡人叶枫1 小时前
Effective C++ 条款39:明智而审慎地使用 private 继承
java·数据库·c++·嵌入式开发
月疯1 小时前
PPG研究中暑的算法记录
算法
春日见1 小时前
vscode的AI编程插件推荐:
大数据·ide·vscode·算法·机器学习·编辑器·ai编程