news 2026/6/9 23:42:25

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

作者头像

张小明

前端开发工程师

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/5 3:58:02

如何高效管理ARK生存进化?TEKLauncher全方位解决方案

如何高效管理ARK生存进化&#xff1f;TEKLauncher全方位解决方案 【免费下载链接】TEKLauncher Launcher for ARK: Survival Evolved 项目地址: https://gitcode.com/gh_mirrors/te/TEKLauncher 你是否也曾经历过这些令人沮丧的游戏时刻&#xff1a;精心挑选的模组组合导…

作者头像 李华
网站建设 2026/6/5 8:45:23

7步构建极致精简Windows 11:Tiny11Builder高效定制指南

7步构建极致精简Windows 11&#xff1a;Tiny11Builder高效定制指南 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 你的电脑是否开机缓慢如蜗牛&#xff1f;系统盘…

作者头像 李华
网站建设 2026/6/5 10:54:32

4步解决Photoshop WebP格式兼容性问题的完整方案

4步解决Photoshop WebP格式兼容性问题的完整方案 【免费下载链接】WebPShop Photoshop plug-in for opening and saving WebP images 项目地址: https://gitcode.com/gh_mirrors/we/WebPShop &#x1f575;️ 问题定位&#xff1a;WebP格式在Photoshop中的兼容障碍分析 …

作者头像 李华
网站建设 2026/6/5 15:14:22

告别混乱!漫画管理与本地导入完全指南

告别混乱&#xff01;漫画管理与本地导入完全指南 【免费下载链接】venera A comic app 项目地址: https://gitcode.com/gh_mirrors/ve/venera 你是否也曾面对过电脑里杂乱无章的漫画文件感到头疼&#xff1f;漫画收藏管理不仅是整理文件&#xff0c;更是构建个性化阅读…

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

ChatGPT提示工程实战:从零构建高效对话系统的核心技巧

1. 低效提示踩坑现场&#xff1a;一个“智能客服”翻车实录 去年我帮朋友搭电商客服机器人&#xff0c;需求很简单&#xff1a;用户问“我的快递到哪儿了”&#xff0c;机器人返回订单状态。 第一次写的提示只有一句话&#xff1a; 你是客服&#xff0c;请回答用户问题。 结果…

作者头像 李华
网站建设 2026/6/5 9:41:39

如何打造专属岛屿:Happy Island Designer全流程指南

如何打造专属岛屿&#xff1a;Happy Island Designer全流程指南 【免费下载链接】HappyIslandDesigner "Happy Island Designer (Alpha)"&#xff0c;是一个在线工具&#xff0c;它允许用户设计和定制自己的岛屿。这个工具是受游戏《动物森友会》(Animal Crossing)启…

作者头像 李华