希尔排序----附图解(C语言)
目录
一、简介
二、代码部分
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语言)相关推荐
- 希尔排序算法(C语言实现)
一.希尔排序 由希尔在1959年提出,设定一个元素间隔增量gap,将参加排序的序列按这个间隔分成若干个子序列,对子序列用一般排序法排序与冒泡排序的思想相似,即将两数比较交换;冒泡法是相邻两数比较交换, ...
- C++实现希尔排序(附完整源码)
C++实现希尔排序 希尔排序(Shell's Sort) 希尔排序源代码 希尔排序(Shell's Sort) 插入排序的一种又称"缩小增量排序"(Diminishing Incr ...
- ds排序--希尔排序_图解直接插入排序和希尔排序
前言 这次我们介绍插入类排序中的 直接插入排序 和 希尔排序 . 对于直接插入排序,虽然它的时间复杂度也是 O(n^2) ,但是在元素 有序或近乎有序 的情况下,时间复杂度可以降为 O(n) ,效率比 ...
- 排序算法——希尔排序的图解、代码实现以及时间复杂度分析
希尔排序(Shellsort) 希尔排序是冲破二次时间屏障的第一批算法之一. 希尔排序通过比较相距一定间隔的元素来工作:各躺比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止.由 ...
- c语言中希尔排序的程序,c语言实现希尔排序算法
1.算法简介 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名.希尔排序实质上是一种分组插入方法.它的 ...
- 排序算法图解(四):希尔排序
文章目录 1 希尔排序简介 2 希尔排序算法图解 3 希尔排序代码实现 写在最后 1 希尔排序简介 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法,其也是一种特殊的插入排序, ...
- python算法与数据结构-希尔排序算法(35)
阅读目录 一.希尔排序的介绍 二.希尔排序的原理 三.希尔排序的图解 四.希尔排序的python代码实现 五.希尔排序的C语言实现 六.希尔排序的时间复杂度 七.希尔排序的稳定性 一.希尔排序的介绍 ...
- Shell Sort 希尔排序 收藏
Shell Sort 希尔排序 收藏 希尔排序(Shell Sort)又叫做缩小增量排序(diminishing increment sort),是一种很优秀的排序法,算法本身不难理解,也很容易实现, ...
- C/C++排序算法(2)希尔排序
常见排序算法总结(2)希尔排序 一篇文章,带你搞懂 希尔排序 (注:代码语言的选择不应该限制了我们对算法的理解) 文章附有动图!一看就懂! (1)工作原理 希尔排序,也称递减增量排序算法,是插入排序的 ...
最新文章
- Leetcode1710. 卡车上的最大单元数[C++题解]:贪心
- 异常与锁的释放(synchronized )
- C#调C++生成的dll报0x800736B1错误
- Spring中使用Spark连接的DataSource
- c++怎么输入带有空格的字符串_C 语言入门 11 fscanf() 函数对空格的处理
- 让你的silverlight更炫(一):从自定义控件说起
- java 19 - 5 Throwable的几个常见方法
- activiti7(三):Activiti7简介与HelloWorld
- 遥控小车遥控赛车html5小游戏源码 【HTML游戏】
- Javascript和C#正则只保留英文、数字、汉语、空格
- 非常详细的图文安装wordpress安装教程
- python自定义标识符的使用区分大小写吗_Python中的标识符是不区分大小写的
- 4k纸是几厘米乘几厘米_4k纸有多大长多少宽多少
- Windows自动同步网络时间
- 虚拟化技术-Qemu-KVM
- 吉利车机安装第三方软件教程,手机修改dns完整操作教程
- 12c oracle 01109,Oracle 12c redo 丢失恢复
- MyBatis框架学习笔记01:初生牛犊
- 与众不同的区块链投资第一课
- js(jquery方式) 直接访问 elasticsearch