基本思想
設待排元素序列有n個,首先取一個整數gap(gap< n)作為間隔,將全部元素分為gap個子序列,所有距離為gap的元素放在同一個子序列中,在每一個子序列中分別進行直接插入排序。然後縮小間隔gap,重復上述的子序列劃分和排序工作。知道最後gap等於1時,將所有元素放在同一個序列中排序為止。
至於gap的取法有各種方案。最初Shell提出取gap=⌊n/2⌋ ,gap=⌊gap/2⌋ ,直到gap=1 。但由於直到最後一步,在奇數位置的元素才會與偶數位置的元素進行比較,其效率將很低。後來Knuth提出取gap=⌊gap/3⌋+1。還有人提出都取奇數為好,也有人提出各gap互質為好。應用不同的序列會使希爾排序算法的性能有很大的差異。
代碼
//待排數據存儲在數組a中,以及待排序列的左右邊界
public void ShellSort(int[] a, int left, int right) {
int gap = right - left + 1;//劃分子序列的間距
do {
gap = gap / 3 + 1;
for (int i = left + gap; i <= right; i++) {
if (a[i] < a[i - gap]) {
int j = i - gap;
int temp = a[i];
do {
a[j + gap] = a[j];
j = j - gap;
} while (j >= left && temp < a[j]);
a[j + gap] = temp;
}
}
} while (gap > 1);
}
性能分析
時間復雜度
對希爾排序的時間復雜度的分析很困難,在特定情況下可以准確地估算元素的比較次數和移動次數,但想要弄清楚元素的比較次數和元素移動次數與增量選擇之間的依賴關系,並給出完整的數學分析,還沒有人能夠做到。
由於即使對於規模較大的序列(n≤1000 ),希爾排序都具有很高的效率。並且希爾排序算法的代碼簡單,容易執行,所以很多排序應用程序都選用額希爾排序算法。
穩定性
希爾排序是一種不穩定的排序算法。