/** * 希爾排序思想:先將整個待排記錄序列分割成若干子序列分別進行直接插入排序, * 待整個序列中的記錄“基本有序”時,再對全體記錄進行一次直接插入排序 * 希爾排序時間複雜度為O(n^3/2) * */public class ShellSort { /** * 以d為增量對數組arr分割成子序列,並對各子序列進行直接插入排序,如果把d換為1則是直接插入排序演算法 * @param arr 要排序的數組 * @param d 增量 */ static void shellInsert(int arr[],int d){ //由於數組是從0下標開始,所以0+d為增量後的第一個元素 for(int i = d;i<arr.length;i++){ if(arr[i]<arr[i-d]){ int temp = arr[i]; int j = i-d; for(;j>=0&&temp<arr[j];j-=d){ arr[j+d] = arr[j]; } arr[j+d] = temp; } } } /** * 外層排序演算法 * @param arr 要排序的數組 * @param dl 增量數組,每次按照增量分割子序列進行排序,增量數組中最後一個必須為1 */ static void shellSort(int arr[],int dl[]){ for(int i = 0;i<dl.length;i++){ shellInsert(arr,dl[i]); System.out.println("第"+(i+1)+"趟排序結果:"); for(int j = 0;j<arr.length;j++) System.out.println(arr[j]); } } //測試..... public static void main(String[] args) { int arr[] = {49,38,65,97,76,13,27,49,55,4}; int dl[] = {5,3,1}; shellSort(arr,dl); System.out.println("排序結果為:"); for(int i = 0;i<arr.length;i++) System.out.println(arr[i]); }}