七大排序之希尔排序

简介: 希尔排序是插入排序的一种,又称为缩小增量法。其思想就是先选定一个整数 gap ,把待排序数组中间隔为 gap 的数分为一组,并对每一组内的数进行插入排序。然后,取,重复上述分组排序工作。当 gap = 1时,所有数在同一组内排好序。

时间复杂度: ~

空间复杂度

稳定性:不稳定

1、基本思想

   希尔排序是插入排序的一种,又称为缩小增量法。其思想就是先选定一个整数 gap ,把待排序数组中间隔为 gap 的数分为一组,并对每一组内的数进行插入排序。然后,取,重复上述分组排序工作。当 gap = 1时,所有数在同一组内排好序。

2、代码讲解和实现

希尔排序实现可以分为两步:

       1:分组

       2:组内排序

① 分组

       我们首先要给 gap 取值,通常 会把数组的长度先赋值给 gap,然后以gap为步长进行分组排序。接着 gap除以2,再进行上述操作。


       最后 我们一定要把数组作为一个整体再进行排序,因为每次分组就肯能落下几个数,所以最后gap 一定要赋值为1。

② 组内排序

       组内排序跟插入排序大致相同,在插入排序中外循环是从 1下标开始进行插入,而在希尔排序中 gap 是不断变化的,所以外循环要从 gap 为下标开始,每次++,争取把每个组都遍历到。


       内循环 j 从 i - gap 开始,每次减去 gap,这样一组内的元素都趋于有序了。

 //组内插入排序
    private static void shell(int[] array,int gap){
        for (int i = gap; i < array.length; i++) {
            int tmp = array[i];
            int j = i-gap;
            for(; j >= 0; j -= gap){
                if(array[j] > tmp){
                    array[j+gap] = array[j];
                }else{
                    break;
                }
            }
            array[j+gap] = tmp;
        }
    }
    //分组
    public static void shellSort(int[] array){
        int gap = array.length;
        while(gap > 1){
            shell(array,gap);
            gap /= 2;
        }
        shell(array,1);//把数组作为一个整体进行排序

3、特性总结

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

2.当gap > 1 时都是预排序,目的是让数组更接近有序。当 gap == 1 时,数组已经接近有序,这样就会很快。这样整体而言,可以达到优化的效果。

3.希尔排序的时间复杂度不好算,因为gap的取值方法很多,导致很难去计算,因此在很多书中给出的希尔排序时间复杂度都不固定。我们可以暂时按照~来算。

  4.希尔排序不是稳定的排序。

目录
打赏
0
0
0
0
1
分享
相关文章
通过E-R理解 主键和外键的关系
实例 现有课程和教师两个实体,课程实体的属性有课程名称、课程编号、课程属性、考试类型;教师实体的属性包括姓名、工号、职称;一门课程可以有多个教师,且每一位教师可以教授多门课程。教师每教授一门课有课序号。
6229 1
通过E-R理解 主键和外键的关系
深入解析网络通信关键要素:IP 协议、DNS 及相关技术
本文详细介绍了IP协议报头结构及其各字段的功能,包括版本、首部长度、服务类型、总长度、标识、片偏移、标志、生存时间(TTL)、协议、首部检验和等内容。此外,还探讨了IP地址的网段划分、特殊IP地址的应用场景,以及路由选择的大致流程。最后,文章简要介绍了DNS协议的作用及其发展历史,解释了域名解析系统的工作原理。
364 5
深入解析网络通信关键要素:IP 协议、DNS 及相关技术
深入浅出:用Python实现简单文本分类器
【8月更文挑战第31天】本文旨在通过简明的Python代码示例,引导读者理解并实现一个简单的文本分类器。从数据预处理到模型训练,再到结果评估,我们将一步步构建起一个基于朴素贝叶斯算法的文本分类系统。无论你是编程新手还是机器学习初学者,这篇文章都将为你打开一扇通往文本分析世界的大门。
Python 用ARIMA、GARCH模型预测分析股票市场收益率时间序列(下)
Python 用ARIMA、GARCH模型预测分析股票市场收益率时间序列
Python 用ARIMA、GARCH模型预测分析股票市场收益率时间序列4
Python 用ARIMA、GARCH模型预测分析股票市场收益率时间序列
【SPSS】两配对样本T检验分析详细操作教程(附案例实战)
【SPSS】两配对样本T检验分析详细操作教程(附案例实战)
1171 0
【SPSS】两配对样本T检验分析详细操作教程(附案例实战)
AVL树的实现(万字图文详解)
AVL树的实现(万字图文详解)
184 1
深入理解网络协议:通信世界的基石
深入理解网络协议:通信世界的基石
243 0
网络协议的重要性与应用:理解进程间通信和网络分层结构(上)
学习网络协议的关键是了解其分层结构。在计算机网络中,我们使用的是OSI标准模型和TCP/IP网络模型。这些模型将网络通信划分为多个层级,每个层级都有不同的功能和作用。在本章节中,我们主要讲解了TCP/IP网络模型的前三层:应用层、传输层和网络层。后面的数据链路层和物理层将在下一篇文章中进行详细讲解
589 0
网络协议的重要性与应用:理解进程间通信和网络分层结构(上)
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问