希尔排序和插入排序很相似,有点像插入排序的升级版本。

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一

希尔排序也是一种插入排序算法,只不过在插入排序上突破了结界,达到了另一种顶峰的存在,这种顶峰使得时间复杂度变成「O(nLogn)~O(n^2)」。

假设我们需要给下面的数据进行排序

结合之前的文章,我们知道两个数据的插入排序就是比较两个数据的大小,然后进行排列。

希尔排序是通过分组+插入

首先我们排序的数量是 8 个,我们需要把数据分成 8/2 = 4组。

如下图

对上面4组的数据进行插入排序后得到

然后再继续分组 8➗2➗2 = 2 分成 2组

这两组数据再进行插入排序

如下图

这样之后,整个数据的排序差不多完成

我们在这个基础上再对整个队列执行一次插入排序,就会完成了整个队列的排序,因为之前已经对数据进行过排序,再进行插入排序的时候,效率会明显得到提升。

整个过程可以观看动态图片

代码实现看看

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int shell_sort(int arr[],int n)
{register int i, j, tmp;int step;for(step = n/2; step > 0;step /= 2)/*增量步长*/{/*step = 4 2 1*/for(i = step; i < n; i++){tmp = arr[i];j = i - step;for(;j >= 0 && tmp < arr[j];){arr[j + step] = arr[j];j -= step;}arr[j + step] = tmp;}}
}#define LENGTH 8int main( int argc, int *argv[])
{int i;int arr[LENGTH] = {6,5,3,1,8,7,2,4};for(i=0;i<LENGTH;i++)printf("%d ",arr[i]);printf("\n");shell_sort(arr,LENGTH);for(i = 0;i < LENGTH;i++)printf("%d ", arr[i]);printf("\n");
}

代码输出

6 5 3 1 8 7 2 4
1 2 3 4 5 6 7 8

代码图片解析

步长等于4的时候,先进行第一次插入排序

步长等于2的时候,先进行第二次插入排序

步长等于1的时候,先进行第三次插入排序

具体过程可以查看插入排序的文章

最后一次进行插入排序之后,就会得到排序完成后的数列


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

图解,C语言希尔排序相关推荐

  1. C语言希尔排序(解析)

    C语言希尔排序(解析) 网上找的移动图:

  2. 动图图解C语言选择排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  3. C语言希尔排序及其增量序列

    希尔排序 前情提要:C语言排序算法 插入排序的神奇之处在于,只要运气够好,甚至可以达到O(n)O(n)O(n)的时间复杂度,希尔排序的思想就是想办法放大这种运气. 希尔排序又称缩小增量排序,据说是第一 ...

  4. 希尔排序c语言,希尔排序(C/C++实现)

    封装成函数: //交换数组元素 void swap(int *a,int i,int j) { int t = a[i]; a[i] = a[j]; a[j] = t; } //希尔排序 void s ...

  5. C语言 希尔排序 使用监视哨

    文章目录 算法介绍 思想讲解 优点 代码 运行结果 算法介绍 希尔排序(Shell's Sort)是插入排序的一种又称"缩小增量排序"(Diminishing Increment ...

  6. matlab实现希尔排序,C语言希尔排序算法

    用希尔排序法对一组数据由小到大进行排序,数据分别为 69.56.12.136.3.55.46. 99.88.25. 实现过程: (1)自定义函数 shsort(),实现希尔排序. (2) main() ...

  7. 【教程】C语言希尔排序算法

    用希尔排序法对一组数据由小到大进行排序,数据分别为 69.56.12.136.3.55.46. 99.88.25. 例子: (1)自定义函数 shsort(),实现希尔排序. (2) main() 函 ...

  8. 希尔排序(ShellSort) c源码

    希尔排序(Shell's Sort)其实是一种优化的插入排序,插入排序(insertSort)平均时间复杂度为O(n^2),仅仅比较时间复杂度的话,优于插入排序的还有很多其它排序方法,比如说堆排序或者 ...

  9. 动图图解C语言插入排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

最新文章

  1. 学习笔记:cache 和spring cache 技术(1)
  2. 在虚拟机中如何安装Mac OS X Snow Leopard 10.6
  3. iOS开发之ImageView复用实现图片无限轮播
  4. 文献记录(part54)--软件缺陷预测中基于聚类分析的特征选择方法
  5. 关于内置浏览器的问题
  6. 正则表达式匹配后删除
  7. python123不能登录_python用户登录,密码错误3次则锁定
  8. oracle 查询当年数据_查询ORACLE数据库TOP SQL使用情况
  9. linux禁止访问国外ip,Shell脚本实现防止国外ip访问服务器
  10. RTX3060安装pytorch
  11. for 循环打印直角三角形、正三角形、棱形
  12. *TEST 2 for NOIP 妈的智障
  13. CS224W摘要12.Frequent Subgraph Mining with GNNs
  14. ai智能写作软件哪个好-ai智能写作免费
  15. 网站中轮播图的制作方法
  16. IE主页无法修改的办法
  17. 日化用品行业数智化B2B系统简化分销流程,提升日化用品企业供应链竞争力
  18. RBAC vs ABAC
  19. 2023秋招--腾讯天美--游戏客户端--二面面经
  20. JavaScript 动态获取ajax 自动刷新接口内容

热门文章

  1. 《Windows PowerShell实战指南(第2版)》——1.4 搭建自己的实验环境
  2. 洛谷 P2735 电网 Electric Fences Label:计算几何--皮克定理
  3. 【转】功能测试的经验总结
  4. hdu - 3415 Max Sum of Max-K-sub-sequence
  5. [文档]. Xilinx - 编写有效的Testbenches
  6. jquery-autocomplete学习(转)
  7. 比tween更有效的tween包.
  8. WeakReference带来了什么
  9. Spring全家桶面试真题
  10. mysql dbo_mysql-双重分组