1. 基本思想
希尔排序法又称缩小增量法。利用越有序,插排效率越大的特性,再进行插排之前进行预排序,让数列尽可能的有序,希尔排序法的基本思想是:
- 先取一个小于
n
的整数d1
作为第一个增量,把数组的全部数据分组 - 分组规则为所有距离为
d1
的倍数的数据放在同一个组中。先在各组内进行直接插入排序,变成有序序列 - 然后,取第二个增量
d2 < d1
重复上述的分组和排序 - 直至所取的增量
dt = 1( dt < dt-1 ,…< d2 < d1)
,即所有记录放在同一组中进行直接插入排序为止
即对数组元素依次进行分组插排,一般将增量选择为 d1 = size / 3 + 1
,这个由经验得出
下图很好的阐述了希尔排序的思想,也有详细排序过程:
2. 代码实现
// 希尔排序(递增)
void ShellSort(int array[], int size) {
int gap = size;
while (1) {
gap = (gap / 3) + 1;
for (int i = gap; i < size; i++) {
int k = array[i];
int j;
for (j = i - gap; j >= 0; j -= gap) {
if (array[j] <= k) {
break;
}
array[j + gap] = array[j];
}
array[j + gap] = k;
}
if (gap == 1) {
break;
}
}
}
测试数据:int array[] = { 3, 9, 1, 4, 2, 8, 2, 7, 5, 3, 6, 11, 9, 4, 2, 5, 0, 6 };
3. 性能分析
时间复杂度
- 最坏 O ( n 2 ) O(n^2) O(n2) 需要刻意构造
- 平均 O ( n 1.3 ) O(n^{1.3}) O(n1.3)
- 最好 O ( n ) O(n) O(n) 已经有序
空间复杂度
- O ( 1 ) O(1) O(1)
排序稳定性
- 不稳定