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

目录

直接插入排序

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

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

希尔排序的特性总结:


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

直接插入排序

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

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

相关推荐
敲代码的小小酥几秒前
谈SpringMVC与Spring WebFlux的区别与适用场景
java·后端·spring
天天被压力7 分钟前
【A股分钟级高频数据完全手册 #03】股票历史1分钟K线数据接口怎么用:Pro版批量拉取与本地缓存
java·人工智能·python
apcipot_rain13 分钟前
C++转Java日记(02)
java·开发语言·c++
nice_lcj52022 分钟前
【从零理解 Spring AI · 03】Spring AI 在 Spring 生态里的位置
java·spring boot·大模型·spring ai·ai应用开发
码农小河6610 小时前
基于SSM+JSP的高校专业信息管理系统【附源码+数据库】
java·开发语言·数据库
其实防守也摸鱼12 小时前
个人学习 Pwn 思路:从基础到漏洞利用的进阶路径
大数据·前端·人工智能·chrome·算法·安全·网络安全
风若飞13 小时前
Spring Ai 入门遇到问题1
java·后端·spring
Nuanyt13 小时前
LeetCode Hot 100 链表专题(五)· 2 题(Java)
java·算法·leetcode·链表
黑马程序员毕设14 小时前
基于 Java 的餐饮点餐系统设计与应用报告
java·开发语言