希爾排序是插入排序的改進版,又稱「縮小增量排序」。它先選取一個小於數組長度的增量 gap,將數組分為若干子序列(間隔 gap 的元素分為一組),對每組進行直接插入排序。隨後逐漸縮小 gap(常用 gap = gap / 2),重複上述過程,直到 gap = 1 進行最後一次插入排序,此時數組基本有序,效率極高。
public class ShellSort {
public static void sort(int[] arr) {
int n = arr.length;
// 增量序列:n/2, n/4, ..., 1
for (int gap = n / 2; gap > 0; gap /= 2) {
// 對每個子序列進行插入排序
for (int i = gap; i < n; i++) {
int temp = arr[i];
int j = i - gap;
// 組內插入排序
while (j >= 0 && arr[j] > temp) {
arr[j + gap] = arr[j];
j -= gap;
}
arr[j + gap] = temp;
}
// 可選:打印每輪排序後狀態
// System.out.println("gap=" + gap + ": " + Arrays.toString(arr));
}
}
}
原始 Shell 序列(n/2^k)並非最優。常用改進序列:
希爾排序適合中等規模數據(數千~數萬),且對內存敏感的嵌入式環境。在 Java 中,Arrays.sort() 對基本類型使用雙軸快速排序,對對象數組使用 TimSort(歸併+插入),希爾排序多用於教學或特定約束場景。