目录

一、简介

二、代码部分

2.1完整代码

2.2代码输出结果

三、代码部分分析

3.1核心代码

3.2代码运行部分的过程(附图解)

四、总结


一、简介

中文名:希尔排序

英文名:Shell's Sort

别名:缩小增量排序

时间复杂度:O(1)

稳定性:不稳定的排序算法

原理:希尔排序是把整个数组元素按下标的一定增量分组,对每组分别使用直接插入排序算法排序;随着增量逐渐减少,每组包含的元素越来越多,当增量减至 1 时,整个数组恰被分成一组,算法便终止,排序完成。

二、代码部分

2.1完整代码

void ShellSort(int* arr, int flag)
{int tap = flag;    //设置排序每组的增量while (tap > 1){tap = tap / 2;   //(每次每组的增量)for (int i = 0; i < flag - tap; i++)//一组一个轮流排{int end = i;int label = arr[end + tap];while (end >= 0){if (label < arr[end]){arr[end + tap] = arr[end];end -= tap;}else{break;}}arr[end + tap] = label;}}
}int main()
{int arr[10] = {8,5,4,2,9,1,0,3,7,6};printf("排列前:");for (int i = 0; i < 10; i++){printf("%d  ", arr[i]);}printf("\n\n");int flag = sizeof(arr) / sizeof(arr[1]);   ShellSort(arr, flag);printf("排列后:");for (int i = 0; i < 10; i++){printf("%d  ", arr[i]);}printf("\n\n");return 0;
}

2.2代码输出结果

三、代码部分分析

3.1核心代码

void ShellSort(int* arr, int flag)
{int tap = flag;    //设置排序每组的增量while (tap > 1){tap = tap / 2;   //(每次每组的增量)for (int i = 0; i < flag - tap; i++)//一组一个轮流排{int end = i;int label = arr[end + tap];while (end >= 0){if (label < arr[end]){arr[end + tap] = arr[end];end -= tap;}else{break;}}arr[end + tap] = label;}}
}

整个希尔排序的过程可看作为,将数组元素每次按照一定的增量进行分组,再对每个组进行插入排序。

tap = tap / 2;我们将数组元素的一半作为,第一次排列的增量,而后的每一次增量都为上一次增量的一半。

3.2代码运行部分的过程(附图解)

首先让我们看原数组(如下图):

在数组元素中,一共有10个元素,所以第一次的增量 tag = 10 / 2 = 5;因此我们可以将数组分成以下五个部分:①arr[0]、arr[5] ;②arr[1]、arr[6];③arr[2]、arr[7];④arr[3]、arr[8];⑤arr[4]、arr[9]。即数组元素{8,1}、{5,0}、{4,3}、{2,7}、{9,6}五部分(如下图)。

然后再将这五组分别进行直接插入排序,最终利用得到如下结果:

而后第二次的增量 tag = 5 / 2 = 2;因此我们可以将数组分成以下两个部分:①arr[0]、arr[2] 、arr[4]、arr[6]、arr[8];②arr[1]、arr[3]、arr[5]、arr[7]、arr[9;]即数组元素{1,3,6,5,7}、{0,2,8,4,9};两个部分(如下图)。

然后再将这两组分别进行直接插入排序,最终利用得到如下结果:

而后第三次的增量 tag = 2 / 2 = 1;因此我们再将数组进行一次直接插入排序,即可,最后得出以下结果(排列结束):

四、总结

希尔排序的优缺点

优点:不需要大量的辅助空间,当刚开始元素无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。代码简单,容易实现。

缺点:对规模非常大的数据希尔排序不是最优选择。

最后到这里,文章就结束了,如果在内容上有问题,恳请各位大佬指出。

希尔排序----附图解(C语言)相关推荐

  1. 希尔排序算法(C语言实现)

    一.希尔排序 由希尔在1959年提出,设定一个元素间隔增量gap,将参加排序的序列按这个间隔分成若干个子序列,对子序列用一般排序法排序与冒泡排序的思想相似,即将两数比较交换;冒泡法是相邻两数比较交换, ...

  2. C++实现希尔排序(附完整源码)

    C++实现希尔排序 希尔排序(Shell's Sort) 希尔排序源代码 希尔排序(Shell's Sort) 插入排序的一种又称"缩小增量排序"(Diminishing Incr ...

  3. ds排序--希尔排序_图解直接插入排序和希尔排序

    前言 这次我们介绍插入类排序中的 直接插入排序 和 希尔排序 . 对于直接插入排序,虽然它的时间复杂度也是 O(n^2) ,但是在元素 有序或近乎有序 的情况下,时间复杂度可以降为 O(n) ,效率比 ...

  4. 排序算法——希尔排序的图解、代码实现以及时间复杂度分析

    希尔排序(Shellsort) 希尔排序是冲破二次时间屏障的第一批算法之一. 希尔排序通过比较相距一定间隔的元素来工作:各躺比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止.由 ...

  5. c语言中希尔排序的程序,c语言实现希尔排序算法

    1.算法简介 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名.希尔排序实质上是一种分组插入方法.它的 ...

  6. 排序算法图解(四):希尔排序

    文章目录 1 希尔排序简介 2 希尔排序算法图解 3 希尔排序代码实现 写在最后 1 希尔排序简介 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法,其也是一种特殊的插入排序, ...

  7. python算法与数据结构-希尔排序算法(35)

    阅读目录 一.希尔排序的介绍 二.希尔排序的原理 三.希尔排序的图解 四.希尔排序的python代码实现 五.希尔排序的C语言实现 六.希尔排序的时间复杂度 七.希尔排序的稳定性 一.希尔排序的介绍 ...

  8. Shell Sort 希尔排序 收藏

    Shell Sort 希尔排序 收藏 希尔排序(Shell Sort)又叫做缩小增量排序(diminishing increment sort),是一种很优秀的排序法,算法本身不难理解,也很容易实现, ...

  9. C/C++排序算法(2)希尔排序

    常见排序算法总结(2)希尔排序 一篇文章,带你搞懂 希尔排序 (注:代码语言的选择不应该限制了我们对算法的理解) 文章附有动图!一看就懂! (1)工作原理 希尔排序,也称递减增量排序算法,是插入排序的 ...

最新文章

  1. Leetcode1710. 卡车上的最大单元数[C++题解]:贪心
  2. 异常与锁的释放(synchronized )
  3. C#调C++生成的dll报0x800736B1错误
  4. Spring中使用Spark连接的DataSource
  5. c++怎么输入带有空格的字符串_C 语言入门 11 fscanf() 函数对空格的处理
  6. 让你的silverlight更炫(一):从自定义控件说起
  7. java 19 - 5 Throwable的几个常见方法
  8. activiti7(三):Activiti7简介与HelloWorld
  9. 遥控小车遥控赛车html5小游戏源码 【HTML游戏】
  10. Javascript和C#正则只保留英文、数字、汉语、空格
  11. 非常详细的图文安装wordpress安装教程
  12. python自定义标识符的使用区分大小写吗_Python中的标识符是不区分大小写的
  13. 4k纸是几厘米乘几厘米_4k纸有多大长多少宽多少
  14. Windows自动同步网络时间
  15. 虚拟化技术-Qemu-KVM
  16. 吉利车机安装第三方软件教程,手机修改dns完整操作教程
  17. 12c oracle 01109,Oracle 12c redo 丢失恢复
  18. MyBatis框架学习笔记01:初生牛犊
  19. 与众不同的区块链投资第一课
  20. js(jquery方式) 直接访问 elasticsearch

热门文章

  1. 音视频开发系列(26)三种方式绘制图片-android开发
  2. 在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1~100分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。同时对评委评分进行裁判,即在10个评委中找出最公平(即评分最接返平均
  3. python 最小外接矩形笔记
  4. 偏振光相机1——偏振光
  5. SAP FICO会计本年利润结转
  6. 基于单片机的宠物定时喂食器设计
  7. 百度网盘青春版开始内测了
  8. C++程序员学习用C#写网站(四)
  9. HTC Android手机刷机详细全教程
  10. 2007-2008年中国十大平面设计公司排名