package sample; /** * 該方法的基本思想是:先將整個待排元素序列分割成若干個子序列 * (由相隔某個「增量」的元素組成的)分別進行直接插入排序,而後依次縮減增量再進行排序, * 待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。 * 由於直接插入排序在元素基本有序的狀況下(接近最好狀況),效率是很高的, * 所以希爾排序在時間效率上比前兩種方法有較大提升。 * @author markGao * */ public class ShellSort { static void doSort(int a[], int n) { int i, j, gap; for (gap = n / 2; gap > 0; gap /= 2) // 步長 for (i = 0; i < gap; i++) // 直接插入排序 { for (j = i + gap; j < n; j += gap) if (a[j] < a[j - gap]) { int temp = a[j]; int k = j - gap; while (k >= 0 && a[k] > temp) { a[k + gap] = a[k]; k -= gap; } a[k + gap] = temp; } } } static void PrintfArray(int a[], int n) { for (int i = 0; i < n; i++) System.out.printf("%d ", a[i]); } public static void main(String[] args) { int MAXN = 5; int[] a = { 9, 3, 5, 7, 2 }; doSort(a, MAXN); PrintfArray(a, MAXN); } }