图解,C语言希尔排序
希尔排序和插入排序很相似,有点像插入排序的升级版本。
希尔排序是希尔(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语言希尔排序相关推荐
- C语言希尔排序(解析)
C语言希尔排序(解析) 网上找的移动图:
- 动图图解C语言选择排序算法,含代码分析
C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...
- C语言希尔排序及其增量序列
希尔排序 前情提要:C语言排序算法 插入排序的神奇之处在于,只要运气够好,甚至可以达到O(n)O(n)O(n)的时间复杂度,希尔排序的思想就是想办法放大这种运气. 希尔排序又称缩小增量排序,据说是第一 ...
- 希尔排序c语言,希尔排序(C/C++实现)
封装成函数: //交换数组元素 void swap(int *a,int i,int j) { int t = a[i]; a[i] = a[j]; a[j] = t; } //希尔排序 void s ...
- C语言 希尔排序 使用监视哨
文章目录 算法介绍 思想讲解 优点 代码 运行结果 算法介绍 希尔排序(Shell's Sort)是插入排序的一种又称"缩小增量排序"(Diminishing Increment ...
- matlab实现希尔排序,C语言希尔排序算法
用希尔排序法对一组数据由小到大进行排序,数据分别为 69.56.12.136.3.55.46. 99.88.25. 实现过程: (1)自定义函数 shsort(),实现希尔排序. (2) main() ...
- 【教程】C语言希尔排序算法
用希尔排序法对一组数据由小到大进行排序,数据分别为 69.56.12.136.3.55.46. 99.88.25. 例子: (1)自定义函数 shsort(),实现希尔排序. (2) main() 函 ...
- 希尔排序(ShellSort) c源码
希尔排序(Shell's Sort)其实是一种优化的插入排序,插入排序(insertSort)平均时间复杂度为O(n^2),仅仅比较时间复杂度的话,优于插入排序的还有很多其它排序方法,比如说堆排序或者 ...
- 动图图解C语言插入排序算法,含代码分析
C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...
最新文章
- 学习笔记:cache 和spring cache 技术(1)
- 在虚拟机中如何安装Mac OS X Snow Leopard 10.6
- iOS开发之ImageView复用实现图片无限轮播
- 文献记录(part54)--软件缺陷预测中基于聚类分析的特征选择方法
- 关于内置浏览器的问题
- 正则表达式匹配后删除
- python123不能登录_python用户登录,密码错误3次则锁定
- oracle 查询当年数据_查询ORACLE数据库TOP SQL使用情况
- linux禁止访问国外ip,Shell脚本实现防止国外ip访问服务器
- RTX3060安装pytorch
- for 循环打印直角三角形、正三角形、棱形
- *TEST 2 for NOIP 妈的智障
- CS224W摘要12.Frequent Subgraph Mining with GNNs
- ai智能写作软件哪个好-ai智能写作免费
- 网站中轮播图的制作方法
- IE主页无法修改的办法
- 日化用品行业数智化B2B系统简化分销流程,提升日化用品企业供应链竞争力
- RBAC vs ABAC
- 2023秋招--腾讯天美--游戏客户端--二面面经
- JavaScript 动态获取ajax 自动刷新接口内容
热门文章
- 《Windows PowerShell实战指南(第2版)》——1.4 搭建自己的实验环境
- 洛谷 P2735 电网 Electric Fences Label:计算几何--皮克定理
- 【转】功能测试的经验总结
- hdu - 3415 Max Sum of Max-K-sub-sequence
- [文档]. Xilinx - 编写有效的Testbenches
- jquery-autocomplete学习(转)
- 比tween更有效的tween包.
- WeakReference带来了什么
- Spring全家桶面试真题
- mysql dbo_mysql-双重分组