news 2026/6/15 16:18:58

【实现常见排序算法】希尔排序的算法思想

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【实现常见排序算法】希尔排序的算法思想

一、前言

上一篇文章我们分析了直接插入排序的时间复杂度,已知它在平衡条件时的时间复杂度都接近O(N^2),为了简化,我们开始寻找方法:

将数组分成多个小数组,分别让他们按照从小到大进行插入排序会不会是一个可行方案,希尔排序则是在此基础上发展来的排序算法。

二、算法思想:

希尔排序又称作缩小增量法,基本思想是先选定一个整数(通常记为gap=n/3 +1),此处n为数组中数据个数,把待排序数组所有数组分成各组,所有距离相等的数据分在同一组内,并对每一组内数据进行插入排序,当gap=1时,就相当于直接插入排序。

gap一般是除以2/3,以n等于6为例,

  • 除以2时,gap=3、1、0.
  • 除以3时,gap=2、0,可见除以3,可以少一些循环.
  • 最后gap要+1,原因是前面已经分组简化了数组,假设gap=0,则最后未进行gap=1时的直接插入排序,故最后gap要+1.

gap > 1时都是预排序,目的是让数组更接近于有序。

gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。

三、代码实现:

void ShellSort(int* arr, int n) { int gap = n; while (gap > 1) { //此处gap必须 > 1 gap = gap/ 3 + 1; //以6为例,gap=3、2、1…最后对gap==1,进行直接插入排序,如若条件为gap>=1,那么就会进入死循环 for (int i = 0;i < n - gap;i++)//注意此处的循环条件, { int end = i; int tmp = arr[end + gap]; while (end >= 0) { if (arr[end] > tmp) { arr[end + gap] = arr[end]; end -= gap; } else { break; } } arr[end+gap] = tmp; } } }

四、时间复杂度:

希尔排序时间复杂度不好计算,因为gap的取值很多,导致很难去计算,因此很多书中给出的希尔排序的时间复杂度都不固定。

// 测试排序的性能对⽐ void TestOP() { srand(time(0)); const int N = 100000; int* a1 = (int*)malloc(sizeof(int) * N); int* a2 = (int*)malloc(sizeof(int) * N); int* a3 = (int*)malloc(sizeof(int) * N); int* a4 = (int*)malloc(sizeof(int) * N); int* a5 = (int*)malloc(sizeof(int) * N); int* a6 = (int*)malloc(sizeof(int) * N); int* a7 = (int*)malloc(sizeof(int) * N); for (int i = 0; i < N; ++i) { a1[i] = rand(); a2[i] = a1[i]; a3[i] = a1[i]; a4[i] = a1[i]; a5[i] = a1[i]; a6[i] = a1[i]; a7[i] = a1[i]; } int begin1 = clock(); InsertSort(a1, N); int end1 = clock(); int begin2 = clock(); ShellSort(a2, N); int end2 = clock(); int begin3 = clock(); /*SelectSort(a3, N); int end3 = clock(); int begin4 = clock(); HeapSort(a4, N); int end4 = clock(); int begin5 = clock(); QuickSort(a5, 0, N - 1); int end5 = clock(); int begin6 = clock(); MergeSort(a6, N); int end6 = clock();*/ int begin7 = clock(); BubbleSort(a7, N); int end7 = clock(); printf("InsertSort:%d\n", end1 - begin1); printf("ShellSort:%d\n", end2 - begin2); /*printf("SelectSort:%d\n", end3 - begin3); printf("HeapSort:%d\n", end4 - begin4); printf("QuickSort:%d\n", end5 - begin5); printf("MergeSort:%d\n", end6 - begin6);*/ printf("BubbleSort:%d\n", end7 - begin7); free(a1); free(a2); free(a3); free(a4); free(a5); free(a6); free(a7); }

(单位为毫秒)

外层循环:
外层循环的时间复杂度可以直接给出为:O(log2n)或者O(log3n),即O(logn)
内层循环:

《数据结构(C语言版)》--- 严蔚敏书中给出的时间复杂度为:

//加油加油!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/2 2:40:06

云数据库管理新范式:CloudBeaver开源工具全攻略

云数据库管理新范式&#xff1a;CloudBeaver开源工具全攻略 【免费下载链接】cloudbeaver Cloud Database Manager 项目地址: https://gitcode.com/gh_mirrors/cl/cloudbeaver 在数字化协作日益频繁的今天&#xff0c;一款高效的云数据库管理工具成为连接团队与数据的关…

作者头像 李华
网站建设 2026/6/15 9:27:45

原神效率革命:从资源浪费到战力飙升的7个认知颠覆

原神效率革命&#xff1a;从资源浪费到战力飙升的7个认知颠覆 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 &#x1f9f0; / Multifunctional Open-Source Genshin Impact Toolkit &#x1f9f0; 项目地址: https://gitcode.com/GitHub_Trending/sn/Snap.Hutao …

作者头像 李华
网站建设 2026/6/15 10:26:05

TrafficMonitor股票插件:打造你的个性化投资监控中心

TrafficMonitor股票插件&#xff1a;打造你的个性化投资监控中心 【免费下载链接】TrafficMonitorPlugins 用于TrafficMonitor的插件 项目地址: https://gitcode.com/gh_mirrors/tr/TrafficMonitorPlugins 你是否曾在工作时频繁切换窗口查看股票行情&#xff1f;是否因错…

作者头像 李华
网站建设 2026/6/14 20:53:20

macOS系统优化终极指南:从卡顿到流畅的效率提升全攻略

macOS系统优化终极指南&#xff1a;从卡顿到流畅的效率提升全攻略 【免费下载链接】Script-Reset-Windows-Update-Tool This script reset the Windows Update Components. 项目地址: https://gitcode.com/gh_mirrors/sc/Script-Reset-Windows-Update-Tool macOS性能优化…

作者头像 李华
网站建设 2026/6/15 10:24:55

ChatGPT Prompt Engineering实战:开发者如何高效管理百度网盘资源

ChatGPT Prompt Engineering实战&#xff1a;开发者如何高效管理百度网盘资源 背景痛点&#xff1a;百度网盘“资源黑洞”的日常 作为开发者&#xff0c;我们习惯把安装包、数据集、镜像、课程视频统统塞进百度网盘。看似无限空间&#xff0c;却带来三座大山&#xff1a; 文件…

作者头像 李华