希尔排序详细的执行步骤如下:
选择一个增量序列 t1, t2, ..., tk,其中 ti > tj,tk = 1;
按增量序列个数 k 对序列进行 k 趟排序;
每趟排序,根据对应的增量 ti 将待排序序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序;
仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
算法图解
问题解疑
希尔排序是原地排序算法吗?
希尔排序是稳定的排序算法吗?
插入排序是稳定的排序算法,但是,由于希尔排序使用了增量间隔进行插入排序,希尔排序并不能像插入排序保持稳定,排序过程中会出现相等的两数前后顺序不一致。
希尔排序的时间复杂度是多少?
\(O(n\;最坏情况时间复杂度为 \(O(n^2\;由于希尔排序花费的时间还由增量间隔决定,平均时间复杂度并不能明确得出,平均时间复杂度可看作为 \(O(n^{1.3 \sim 2}\。
代码实现
package cn.fatedeity.algorithm.sort;
/**
* 希尔排序算法
*/
public class ShellSort {
public static int[] sort(int[] numbers {
int length = numbers.length;
// 通常增量序列进行二分对原序列拆分
for (int gap = length >> 1; gap > 0; gap = gap >> 1 {
for (int i = gap; i < length; i++ {
int j = i, current = numbers[i];
while (j >= gap && numbers[j - gap] > current {
numbers[j] = numbers[j - gap];
j = j - gap;
}
numbers[j] = current;
}
}
return numbers;
}
}