希爾排序
希爾排序是優化後的插入排序,又名玄學排序,因爲希爾排序是不穩定的。希爾排序就是將一個數組分成間隔爲h的子數組,並對這些子數組進行插入排序,通過不斷地縮小h的值,從而滿足插入排序適合的情形:數組基本有序,從而達到良好的性能。
難點
希爾排序的難點在於遞增序列的選擇,我使用的是《算法(第四版)》中推薦的遞增序列,即1/2(3k-1),從N/3開始遞減至1。
演示
代碼實現
希爾排序的代碼與插入排序相似,只是增加了一個增量h
int N = t.length;
int h = 1;
while (h < N / 3) {
h = 3 * h + 1;
}
while (h >=1) {
for (int i = h; i < t.length; i++) {
int key = t[i];
int j = i - h;
while (j >= 0 && t[j] > key) {
t[j + h] = t[j];
j -= h;
}
t[j + h] = key;
}
h /= 3;
}
總結
通過對希爾排序運行時間的測試,發現希爾排序比插入排序和選擇排序要快很多,尤其是數組越大的時候。希爾排序最壞運行時間爲O(n2),最好運行時間爲O(n),平均運行時間爲O(n1.3)。有經驗的程序員有時會用到希爾排序,因爲對於中等大小的數組,它的運行時間是可以被接受的,並且不佔用額外的空間。