针对快速排序的优化,原理在快速排序前针对使数组内任意间隔为H的字数组是有序的,当H变化为1时直接为快速排序,大概的代码描述如下:
public class ShellSort {public static void sort(int[] a)
{
int N = a.length;
int H = 1;
while(H< 3/N)
{
H = 3*H+1;
}
while(H >= 1)
{
for (int i = H; i<N;i++) {
for (int j = i; j > 0 && (a[j]<a[j-H]); j = j-H) {
swap(a[i], a[i-H]);
}
}
H = H/3;
}
}
}
希尔排序的高效原因在于平衡了子数组的规模和有序性,希尔排序的时间复杂度与增量序列的选取有关,例如希尔增量时间复杂度为O(n²),而Hibbard增量的希尔排序的时间复杂度为O(
算法效率取决于H 和H的变化因子,这个目前貌似没有定论,需要数学来论证。