1. 程式人生 > 其它 >資料結構與演算法之希爾排序

資料結構與演算法之希爾排序

希爾排序是插入排序的優化版本.插入排序的思路是每次跟前一個比較,需要交換則交換,然後指標向後移動,再次與前面的比較,如果不需要交換則表示前邊的前邊也不需要交換.

希爾排序則是通過新增一個步長的概念,每次把當前元素與增加步長後的元素比較,如果交換則交換.然後再次增加步長去比較,這個過程與插入排序一樣.希爾排序與插入排序的

區別在於希爾排序通過步長將陣列劃分為子陣列,將子陣列通過插入排序.而步長也要不斷的遞減,直到步長是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; } } }