希尔排序算法

devtools/2024/11/13 16:05:57/

1、基本思想

        希尔排序也称缩小增量排序,是插入排序的一种更高效的改进版本。它的基本思想是先将待排序的数组元素按照一定的间隔(称为增量)分成若干个子序列,分别对这些子序列进行插入排序,随着迭代的进行,逐渐减小这个间隔,直到最后间隔为1时,对整个数组进行一次插入排序。通过这种方式,让元素能够在相对较远的位置上快速移动到大致合适的位置,使得后续在间隔较小的插入排序时,元素的移动次数减少,从而提高排序效率。

2、算法步骤

2.1、算法步骤描述:

        1.根据实际情况选择增量序列,增量序列的形式为h1,h2,h3……hn,序列满足h1>h2>h3>……>hn=1,通常h1=N/2,N为待排序数组的长度,常见的增量选取可以按照hi+1=hi/2,也可以按照实际进行其他选择。

        2.根据当前增量将待排序数组分成若干个子序列,每个子序列同等位置的间隔为hi 。例:以数组a[10]={a0,a1,a2,a3,a4,a5,a6,a7,a8,a9},以h1=N/2,hi+1=hi/2进行增量选取,那么第一轮划分中,增量为5,数组arr将被分成如下两个子序列:{a[0],a[5]},{a[1],a[6]},{a[2],a[7]},{a[3],a[8]},{a[4],a[9]}。第二轮划分中,增量为2,数组arr将被分成如下序列:{a[0],a[2],a[4],a[6],a[8]},{a[1],a[3],a[5],a[7],a[9]},增量为1时进行最后一次划分……

        3、对于步骤2中每一轮划分得到的子序列,每个子序列分别进行插入排序。插入排序的过程就是在子序列中,将每个元素与其前面已排好序的元素依次比较并移动到合适位置,使得子序列有序。

        4、当增量减小到1时,对整个数组进行最后一次插入排序,此时数组就完成了排序。

2.2、希尔算法>排序算法动态演示图:

3、代码实现

c语言代码实现如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
void sort(int arr[])
{int gap = N;while(gap != 1){gap = gap/2; //确定本轮排序增量for(int i = 0; i < gap; i++)//增量决定这一轮进行插入排序的次数{for(int j = i; j + gap < N ;j = j + gap)//对根据增量分成的其中一组进行插入排序{int end = j;//重置本轮扫描位置int insert = arr[end+gap];//本轮要插入的数据while(insert < arr[end] && end >= i){arr[end+gap] = arr[end];//移动end = end - gap;//改变下次开始扫描位置}arr[end+gap] = insert;//插入}}}}
int main(int argc, char *argv[])
{srand(time(NULL));int a[N];int i;puts("排序前数组为:");for(i = 0; i < N; i++){a[i] = rand()%100;//为数组随机赋值printf("%d ",a[i]);//输出排序之前数组值}puts("");sort(a);//排序puts("排序后的数组为:");for(i = 0; i < N; i++){printf("%d ",a[i]);//输出排序之后的数组值}puts("");return 0;
}

4、时间复杂度和空间复杂度

希尔排序的时间复杂度与所选择的增量序列密切相关。

平均时间复杂度:O(n^1.3)到O(n^1.5)之间,具体取决于增量序列的选择。

空间复杂度:希尔排序是一种原地算法>排序算法,空间复杂度为O(1)。

稳定性:希尔排序是不稳定的算法>排序算法。在排序过程中,由于相同元素可能在不同的子序列中移动,并且在最后一次整体插入排序时,它们的相对顺序可能会发生改变。

5、适用情况

1、当数据规模不是特别大,且对空间复杂度有一定要求的情况下。

2、由于其实现相对简单,在一些对排序速度要求不是极高、且数据的分布情况不太明确的场景下,也可以考虑使用希尔排序。


http://www.ppmy.cn/devtools/133065.html

相关文章

什么岗位需要学习 OpenGL ES ?说说 3.X 的新特性

什么是 OpenGL ES OpenGL ES 是一种为嵌入式系统和移动设备设计的3D图形API(应用程序编程接口)。它是标准 OpenGL 3D 图形库的一个子集,专门为资源受限的环境(如手机、平板电脑、游戏机和其他便携式设备)进行了优化。 由于其在移动设备上的广泛适用性,OpenGL ES是学习移…

RabbitMQ的DLX(Dead-Letter-Exchange 死信交换机,死信交换器,死信邮箱)(重要)

RabbitMQ的DLX 1、RabbitMQ死信队列2、代码示例2.1、队列过期2.1.1、配置类RabbitConfig&#xff08;关键代码&#xff09;2.1.2、业务类MessageService2.1.3、配置文件application.yml2.1.4、启动类2.1.5、配置文件2.1.6、测试 2.2、消息过期2.2.1、配置类RabbitConfig2.2.2、…

如何解决后端开发时使用WebSocket服务部署问题

如何解决后端开发时使用WebSocket服务部署问题 WebSocket服务使用的为hocuspocus技术&#xff0c;启动WebSocket服务的命令为&#xff1a; npx hocuspocus/cli --port 2345 --sqlite该方式会自动下载依赖包&#xff0c;并进行启动服务。 启动服务的脚本如下&#xff1a; (b…

pyspark入门基础详细讲解

1.前言介绍 学习目标&#xff1a;了解什么是Speak、PySpark&#xff0c;了解为什么学习PySpark&#xff0c;了解课程是如何和大数据开发方向进行衔接 使用pyspark库所写出来的代码&#xff0c;既可以在电脑上简单运行&#xff0c;进行数据分析处理&#xff0c;又可以把代码无缝…

vue3学习:查询城市天气预报案例(vite组合式实现)

前面的学习中&#xff0c;实现过网页版的查询城市天气预报&#xff0c;今天新建了一个vite项目来实现&#xff0c;并且使用element-plus组件&#xff0c;把网页效果适当美化了一下&#xff0c;运行效果如图所示。 步骤如下&#xff1a; 一、新建项目 步骤如下&#xff1a; 1.…

SpringBoot健身房管理:敏捷与自动化

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了健身房管理系统的开发全过程。通过分析健身房管理系统管理的不足&#xff0c;创建了一个计算机管理健身房管理系统的方案。文章介绍了健身房管理系统的系统分析部…

终端NuShell git权限异常处理

使用nushell git,关联老的秘钥文件 D:\phpstudy_pro\WWW\xmh\backend|10-312> mkdir d:\Users\Administrator\.ssh PC-20240719ZOSM||2411063145840 D:\phpstudy_pro\WWW\xmh\backend|10-312> cp -r c:\U…

初学Java基础---Day21---正则表达式,日期类,Math类,Random类,System类,Runtime类,大数值运算类,

一&#xff0c;正则表达式 理解&#xff1a; 符合某个语句规范的字符串 案例&#xff1a; //案例&#xff1a;把一个字符串中带电话号码替换成 130****1111 的形式String str "小红 13012341111 小绿15112342222 小黑13912343333";//分析&#xff1a;电话号码可以…