java插入排序和希尔排序实现思路及代码

 更新时间:2025年03月10日 08:29:12   作者:Excuse_lighttime  
这篇文章主要介绍了插入排序和希尔排序两种排序算法,文章通过代码示例和图解详细介绍了这两种排序算法的实现过程和原理,需要的朋友可以参考下

插入排序(稳定)

假设有这样一个数组,想要从小到大进行排序:

int[] array = {4,9,5,8,6,2,10,7,3,1};

插入排序代码实现:

public static void insertSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int ret = arr[i];
            int j = i - 1;
            for (; j >= 0 ; j--) {
                if(arr[j] > ret) {
                    arr[j+1] = arr[j];
                }else {
                    //arr[j+1] = ret;
                    break;
                }
            }
            arr[j+1] = ret;
        }
    }

代码运行结果:

可以看到,结果是从小到大排序的。

插入排序思路:

假设有个待排序数组(黑色数字),定义一个 i 下标,一个 j 下标,再定义一个记录i下标的值的ret。

首先,i 下标从 1 位置开始,j 下标在 i - 1位置开始,当 j 下标的值比 ret 的值大,把 j 下标的值给到 j+1 的位置。反之 把ret 的值给到 j+1的位置。以此往复。

值得注意的是,比如数组的最小的元素(上图的是0), j 会到达下标为 -1 的位置,此时,循环里的  arr[j+1] = ret; 这句代码就执行不到了,意思就是数组最小元素 0 放不到下标为 0 的位置。所以在外面 加上一句 arr[j+1] = ret; 代码。这句代码和 循环里的这句代码重复了,就把 循环里的这句代码注释了。

 希尔排序(不稳定):

什么是希尔排序:

把待排序数据分成多个组,所有距离为的记录分在同⼀组内,并对每⼀组内的记录进行插入排序。然后,重复上述分组和排序的过程。当到达=1时,所有记录在统⼀组内排好序。

什么意思呢?

如图:

先假定 gap的大小,这里初始的 gap 是5,让 每个数据之间都相差 距离为 gap 的大小,如果后面的最远的数据相差比 gap小就 不相连,这样就为一组了。下一个 组 从第二个数据开始,直到包含所有数据。分组就结束了。

然后,对其中的一趟的 每一组进行插入排序,再不断缩小gap的大小,直到gap的大小为1,gap的大小为1就是一次完整的插入排序了。当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。

所有,可以说希尔排序是对插入排序的优化。

一样,我们假设有这样一个数组,想要从小到大进行排序:

 int[] array = {4,9,5,8,6,2,10,7,3,1};

希尔排序代码实现:

 public static void shellSort(int[] arr) {
        int gap = arr.length / 2;
        while(gap > 0) {
            shell(arr,gap);
            gap /= 2;
        }
    }

    public static void shell(int[] arr,int gap) {
        for (int i = gap; i < arr.length; i++) {
            int ret = arr[i];
            int j = i - gap;
            for (; j >= 0 ; j -= gap) {
                if(arr[j] > ret) {
                    arr[j+gap] = arr[j];
                }else {
                    //arr[j+1] = ret;
                    break;
                }
            }
            arr[j+gap] = ret;
        }
    }

希尔排序思路:

结合上图,这是 gap 为 2 的时候的情况,与插入排序类似,结合代码看,把红色组别看成一组数据,先让 下标 i 等于 gap的位置,j 在 i - gap 的位置,确保他们是在红色组别位置进行插入排序,下一次,i 加加,到了绿色组别位置,再让 j 在 i - gap 的位置,确保他们是在绿色组别位置进行插入排序。可以看出,他们是在红色和绿色组别交替进行插入排序的。

直到 gap 为 1 ,就可以看作一次普通的插入排序了。      

至于起始的 gap 选多大是无法给出正确答案的,希尔排序时间复杂度不好计算,因为 gap 的取值很多,导致很难去计算。

总结

到此这篇关于java插入排序和希尔排序实现思路及代码的文章就介绍到这了,更多相关java插入排序和希尔排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring占位符Placeholder的实现原理解析

    Spring占位符Placeholder的实现原理解析

    这篇文章主要介绍了Spring占位符Placeholder的实现原理,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • java能写爬虫程序吗

    java能写爬虫程序吗

    在本篇文章里小编给大家整理的是一篇关于java是否能写爬虫程序的一篇文章,对此有兴趣的朋友们可以学习下。
    2021-01-01
  • 如何处理maven仓库中后缀LastUpdated文件

    如何处理maven仓库中后缀LastUpdated文件

    这篇文章主要介绍了如何处理maven仓库中后缀LastUpdated文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Ribbon负载均衡算法原理与使用介绍

    Ribbon负载均衡算法原理与使用介绍

    在微服务中,对服务进行拆分之后,必然会带来微服务之间的通信需求,而每个微服务为了保证高可用性,又会去部署集群,那么面对一个集群微服务进行通信的时候,如何进行负载均衡也是必然需要考虑的问题
    2022-09-09
  • Java实现数据脱敏的方法详细讲解

    Java实现数据脱敏的方法详细讲解

    这篇文章主要给大家介绍了关于Java实现数据脱敏的相关资料,数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护,需要的朋友可以参考下
    2023-06-06
  • Java CompletableFuture使用方式

    Java CompletableFuture使用方式

    这篇文章主要介绍了Java CompletableFuture使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java实现从Html文本中提取纯文本的方法

    Java实现从Html文本中提取纯文本的方法

    今天小编就为大家分享一篇Java实现从Html文本中提取纯文本的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 浅谈java中字符串数组、字符串、整形之间的转换

    浅谈java中字符串数组、字符串、整形之间的转换

    这篇文章主要介绍了浅谈java中字符串数组、字符串、整形之间的转换,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 解决jhipster修改jdl生成的实体类报错:liquibase.exception.ValidationFailedException: Validation Failed

    解决jhipster修改jdl生成的实体类报错:liquibase.exception.ValidationFailed

    这篇文章主要介绍了解决jhipster修改jdl生成的实体类报错:liquibase.exception.ValidationFailedException: Validation Failed问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • java从字符串中提取数字的简单实例

    java从字符串中提取数字的简单实例

    下面小编就为大家带来一篇java从字符串中提取数字的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10

最新评论