希爾排序

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);
    }
}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息