希尔排序又称“缩小增量排序”,是插入排序的一种。直接插人排序,当待排序的记录个数较少且待排序序列的关键字基本有序时,效率较高。希尔排序基于以上两点,从“减少记录个数”和“序列基本有序”两个方面对直接插入排序进行了改进。
(1)步骤:
1. 先选定一个小于N的整数gap作为第一增量,然后将所有距离为gap的元素分在同一组,并对每一组的元素进行直接插入排序。然后再取一个比第一增量小的整数作为第二增量,重复上述操作…
2. 当增量的大小减到1时,就相当于整个序列被分到一组,进行一次直接插入排序,排序完成。
(2)特点:
1. 缩小增量
2. 多遍插入排序
3. 时间复杂度:O(n 1.3 n^{1.3}n 1.3 )
4. 空间复杂度:O(1)
5. 稳定性:不稳定
(3)动图演示:
这里重要的是理解分组思想,每一个组其实就是一个插入排序,相当于进行多次插入排序。
(4)C语言代码实现如下:
#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 8 int 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
知识点标签:排序
本文固定URL:https://www.dotcpp.com/course/935
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程