前言
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。
希尔排序的实质就是分组插入排序,它们的思想高度是一致的的(为了共产主义😁😁😁),不过希尔排序的速度蛮快的,甚至可以与快速排序相媲美!
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
- 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
- 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;
不好意思上面的部分来自维基百科
好了,第一部分介绍完了,我们来看图说画:
看图说话
以一个 n = 11 的数组为例:

第一次
第一步 设步长为 2 则 int gap = 11/2 = 5
将数组分为 5 组,每组两个数据

第二步
那么就被分成了 A B C D E 这几组数据:

第三步
对每组数据进行排序:

于是数组变为下面的:

第二次
第一步 重复上面第一步 int gap = 5/2 = 2
将数组分为 2 组,每组5个数据

第二步
那么就被分成了 A B 这两组数据:

第三步
对每组数据进行排序:

于是数组变为下面的:

第三次
第一步 重复上面第一步 int gap = 2/2 = 1
将数组分为 1 组,那就是整个数组

对整个数组进行排序:
第四次
第一步 重复上面第一步 int gap = 1/2 = 0
则此时 数组排序已经完成
看程序
经过上面的一步步的分析,相信大家已经可以看得懂下面的程序(按照上面的理解即可)
1 | void shellsort2(int a[], int n) { |
测试
下面我们开始测试,同样的四种:
- 有序
- 近乎有序
- 随机
- 倒叙
我们测试100W个数据,测试它的排序时间,测试用例的程序在这里,测试代码如下:
1 | int n = 100000; |
log如下:
1 | **************有序************* |
由此可以看出 希尔排序的强悍,特别是对于最坏情况的排序,是未优化过的插入排序的近4000倍!
不知道希尔排序 大家搞明白了么!!! 😀😀😀
最后附上Demo