資料結構與演算法之希爾排序
阿新 • • 發佈:2022-04-18
希爾排序是插入排序的優化版本.插入排序的思路是每次跟前一個比較,需要交換則交換,然後指標向後移動,再次與前面的比較,如果不需要交換則表示前邊的前邊也不需要交換.
希爾排序則是通過新增一個步長的概念,每次把當前元素與增加步長後的元素比較,如果交換則交換.然後再次增加步長去比較,這個過程與插入排序一樣.希爾排序與插入排序的
區別在於希爾排序通過步長將陣列劃分為子陣列,將子陣列通過插入排序.而步長也要不斷的遞減,直到步長是1此時就退化為插入排序.
這個演算法最好情況下時間複雜度:O(n)平均情況下時間複雜度:O((nlog(n))^2)
public static void xier(int[] arr) {
int gap = arr.length;
while ((gap = gap / 2) > 0) {
for (int i = gap; i < arr.length; i++) {
for (int j = i; j >= gap; j -= gap) {
if (arr[j] < arr[j - gap]) {
int temp = arr[j];
arr[j] = arr[j - gap];
arr[j - gap] = temp;
} else {
break;
}
}
}
}
}
以下程式碼提供一個測試方法.
public static void main(String[] args) {
Random random = new Random();
while (true) {
int length = random.nextInt(100);
length = 5;
int[] arr = new int[length];
int[] arr2 = new int[length];
for (int x = 0; x < length; x++) {
int i = random.nextInt(100);
arr[x] = i;
arr2[x] = i;
}
xier(arr);
Arrays.sort(arr2);
boolean equals = Arrays.equals(arr2, arr);
System.out.println(equals);
if (!equals) {
break;
}
}
}