java實現 》從 》 直接插入排序 》到》 希爾排序
阿新 • • 發佈:2018-11-16
直接插入排序和希爾排序,把這兩個放一起是便於記憶,這兩個排序是差不多的,希爾排序也只是對插入排序進行一點修改:
首先是看一下我們的插入排序:
package sort; public class InsertSort { public static void main(String[] args) { int[] arr = { 1, 2, 3, 5, 4, 6 }; sort(arr); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } public static void sort(int[] arr) { for (int i = 1; i < arr.length; i++) { int insertNum = arr[i];// 待插入 for (int j = i - 1; j >= 0; j--) { if (insertNum < arr[j]) { arr[j + 1] = arr[j]; } else { arr[j + 1] = insertNum; break; } } } } }
控制檯如下:
下邊講解我們希爾排序:
package sort; public class SheelSort { public static void main(String[] args) { int[] arr = { 1, 2, 3, 5, 4, 6 }; sort(arr); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } public static void sort(int arr[]) { int divideNum = arr.length / 2; while (divideNum != 0) { for (int k = 0; k < divideNum; k++) { for (int i = k + divideNum; i < arr.length; i = i + divideNum) { int InsertNum = arr[i]; for (int j = i - divideNum; j >= 0; j = j - divideNum) { if (InsertNum < arr[j]) { arr[j + divideNum] = arr[j]; } else { arr[j + divideNum] = InsertNum; break; } } } } divideNum = divideNum / 2; } } }
輸出:
我們看到希爾排序中就相當於是多了兩層迴圈,第一層迴圈是:為了進行分塊處理,而且不斷的細分一直到間隔是1位置。第二層迴圈表示有多少個這種子塊,有多少子塊就要進行多少次的插入排序。