Merge sort

Merger sort就是不斷的將兩個數組合併到一個,用 array做的話需要額外的 O(n) 空間來放排序後的結果

思路就是數組分一半左右各自遞迴 sort之後,再 merge起來完成 merge sort

想不通 merge 那邊可以這樣思考:假設現在左邊和右邊已經做完,那就只是要把左邊和右邊比大小然後放到額外的 array裡

public void sortIntegers2(int[] A) {
    int[] results = new int[A.length];
    mergeSort(A, 0, A.length - 1, results);
}

private void mergeSort(int[] array, int start, int end, int[] results) {

    //end of recursion
    if (start >= end) {
        return;
    }

    int left = start;
    int mid = (start + end) / 2;
    int right_head = mid + 1;

    mergeSort(array, left, mid, results);
    mergeSort(array, right_head, end, results);
    merge(array, start, mid, end, results);
}

private void merge(int[] array, int start, int mid, int end, int[] results) {

    int left = start;
    int right = mid + 1;
    int index = start;

    while (left <= mid && right <= end) {
        if (array[left] < array[right]) {
            results[index] = array[left];
            index++; 
            left++;
        } else {
            results[index] = array[right];
            index++; 
            right++;
        }
    }

    while (left <= mid) {
        results[index] = array[left];
        index++;
        left++;
    }

    while (right <= end) {
        results[index] = array[right];
        right++;
        index++;
    }

    for (int i = start; i <= end; i++) {
        array[i] = results[i];
    }
}

而最後面的

while (left <= mid && right <= end) {
    ...
}
while (left <= mid) {
    ...
}
while (right <= end) {
    ...
}

代表某一邊先挑完,再把剩下的寫入,因為前面是左右各自去做 merge sort,已經把左右都先 sort完

所以這裡某一邊先挑完後,表示比剩下那邊小的數都已經寫到 results了,再把剩下那邊寫入即可。

results matching ""

    No results matching ""