希尔排序又称缩小增量排序。
希尔排序是插入排序中的一种:
希尔排序是在时间复杂度上突破O(N2)的第一个排序,希尔排序也是直接插入排序的一种,因为希尔排序的内部排序是采用直接插入排序来实现的。
希尔排序的原理:
让元素分组,让其各自排序完整之后,整个序列变得基本有序,就是分成多组,前面一组的元素都小于后面组的元素,最后在对全体元素进行一次直接插入排序。
具体原理:
1)将所有元素按照某个法则分成若干子序列,分别对各自子序列进行直接插入排序
2)依次缩减增量再进行排序,直至增量足够小时,对全体元素进行依次直接插入排序。
以n=12的一个数组为例,增量按照n/2:
第一次增量是6,第一次循环排序
11 32 43 12 65 2 12 35 35 10 14 13
1 1
2 2
3 3
4 4
5 5
6 6
第二次增量是3,第二次循环排序
11 32 15 10 14 2 12 32 43 12 65 12
1 1 1 1
2 2 2 2
3 3 3 3
依次进行下去。。。。
这里可以看出两个35的相对位置发生了变化,所以希尔排序是一种不稳定的排序方法
希尔排序c语言实现:
- void shellsort3(int a[], int n)
- {
- int i, j, gap;
- for (gap = n / 2; gap > 0; gap /= 2) //一个gap长度的元素与下个gap长度的元素进行比较,也可以另一种方法,每个组之间比较,都是可以
- for (i = gap; i < n; i++)
- for (j = i - gap; j >= 0 && a[j] > a[j + gap]; j -= gap)
- Swap(a[j], a[j + gap]);
- }
算法的时间复杂度:
希尔排序的时间复杂度与增量序列的选取有关,例如希尔增量时间复杂度为O(n²),而Hibbard增量的希尔排序的时间复杂度为O(


也可以采用斐波拉契数列的形式分增量序列
算法的空间复杂度:
由于内部的排序实质上是插入排序,所以空间复杂度为O(1)
建议:链表形式存储的序列不适合希尔排序
以上仅是个人理解,如果有误,请提出批评指正,交流才能不断地进步!