Java 歸併排序和快速排序代碼練習

 // 歸併排序算法, a是數組,n表示數組大小
    public static void mergeSort(int[] a, int n) {
        mergeSortInternally(a, 0, n-1);
    }

    // 遞歸調用函數
    private static void mergeSortInternally(int[] a, int p, int r) {
        // 遞歸終止條件
        if (p >= r) return;

        // 取p到r之間的中間位置q,防止(p+r)的和超過int類型最大值
        int q = p + (r - p)/2;
        // 分治遞歸
        mergeSortInternally(a, p, q);
        mergeSortInternally(a, q+1, r);

        // 將A[p...q]和A[q+1...r]合併爲A[p...r]
        merge(a, p, q, r);
    }

    private static void merge(int[] a, int p, int q, int r) {
        int i = p;
        int j = q+1;
        int k = 0; // 初始化變量i, j, k
        int[] tmp = new int[r-p+1]; // 申請一個大小跟a[p...r]一樣的臨時數組
        while (i<=q && j<=r) {
            if (a[i] <= a[j]) {
                tmp[k++] = a[i++]; // i++等於i:=i+1
            } else {
                tmp[k++] = a[j++];
            }
        }

        // 判斷哪個子數組中有剩餘的數據
        int start = i;
        int end = q;
        if (j <= r) {
            start = j;
            end = r;
        }

        // 將剩餘的數據拷貝到臨時數組tmp
        while (start <= end) {
            tmp[k++] = a[start++];
        }

        // 將tmp中的數組拷貝回a[p...r]
        for (i = 0; i <= r-p; ++i) {
            a[p+i] = tmp[i];
        }
    }

    // 快速排序,a是數組,n表示數組的大小
    public static void quickSort(int[] a, int n) {
        quickSortInternally(a, 0, n-1);
    }

    // 快速排序遞歸函數,p,r爲下標
    private static void quickSortInternally(int[] a, int p, int r) {
        if (p >= r) return;

        int q = partition(a, p, r); // 獲取分區點
        quickSortInternally(a, p, q-1);
        quickSortInternally(a, q+1, r);
    }

    private static int partition(int[] a, int p, int r) {
        int pivot = a[r];
        int i = p;
        for(int j = p; j < r; ++j) {
            if (a[j] < pivot) {
                if (i == j) {
                    ++i;
                } else {
                    int tmp = a[i];
                    a[i++] = a[j];
                    a[j] = tmp;
                }
            }
        }

        int tmp = a[i];
        a[i] = a[r];
        a[r] = tmp;

        System.out.println("i=" + i);
        return i;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章