希爾排序是直接插入排序算法的一種更高效的改進版本,又稱"縮小增量排序"。希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序算法排序;隨着增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,算法結束。
希爾排序:
時間複雜度是O(nlogn)
最好情況O(nlog2n)
最壞情況O(nlog2n)
空間複雜度 O(1)
排序方式不佔用額外內存,希爾排序是不穩定的。
圖解
核心代碼
public static void shellSort(int arr[]){
//增量gap,並逐步的縮小增量
for (int gap = arr.length/2; gap > 0; gap /= 2) {
//從第gap個元素,逐個對其所在的組進行直接插入排序
for (int i = gap; i < arr.length; i++) {
int j = i;
int temp = arr[j];
if (arr[j] < arr[j - gap]){
while (j - gap >= 0 && temp < arr[j-gap]){
//移動
arr[j] = arr[j - gap];
j -= gap;
}
//當退出while後,就給temp找到插入的位置
arr[j] = temp;
}
}
}
}