思路
希爾排序是希爾(Donald Shell)於1959年提出的一種排序算法。希爾排序也是一種插入排序,它是簡單插入排序經過改進之后的一個更高效的版本,也稱為縮小增量排序,同時該算法是沖破O(n2)的第一批算法之一。它與插入排序的不同之處在於,它會優先比較距離較遠的元素。希爾排序又叫縮小增量排序。
希爾排序是把記錄按下表的一定增量分組,對每組使用直接插入排序算法排序;隨着增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成一組,算法便終止。
時間復雜度
最佳情況:T(n) = O(nlog2 n) 最壞情況:T(n) = O(nlog2 n) 平均情況:T(n) =O(nlog2n)
代碼
import java.util.Arrays;
/**
* 希爾排序
* @author remainsu
* @version 1.0 2019-06-06
*/
public class ShellSort {
/**
* 排序方法
* @param arr 待排序的數組
* @return toString 方便輸出
*/
public static String shellSort(int[] arr) {
//當前正在比較的數字(下方簡稱:“當前”)
int current;
//初始增量(此處為:希爾增量)
int gap = arr.length / 2;
//gap=1的時候,數組已經有序
while(gap > 0) {
for(int i=gap; i<arr.length; i++) {
current = arr[i];
//與“當前”同組的前一個數字
int preIndex = i - gap;
//找到同組內比“當前”小的數字
while(preIndex >= 0 && current < arr[preIndex]) {
//在向后移動同組內已排好序的,大於“當前”的數字
arr[preIndex + gap] = arr[preIndex];
preIndex -= gap;
}
//插入“當前”到相應的位置
arr[preIndex + gap] = current;
}
//縮小增量
gap /= 2;
}
return Arrays.toString(arr);
}
public static void main(String[] args) {
int[] arr = {111, 3, 5, 52, 74, 312, 75, 3, 764, 3, 2111, 7, 31};
System.out.println("排序后的數組:"+ shellSort(arr));
}
}