O(n log n) - Merge Sort

Merge Sort is based on the divide-and-conquer paradigm.

Merge Sort involves 3 steps:

  1. Divide the array into two or more subarrays
  2. Sort each subarray(Conquer)
  3. Merge them into one


    Merge Sort 例子

daima:

int[] buffer = null;

public void mergeSort(int[] array) {
    if (array == null || array.length == 0) {
        return;
    }
    buffer = new int[array.length];
    mergeSortHelper(array, 0, array.length - 1);
}

private void mergeSortHelper(int[] array, int startIndex, int endIndex) {
    if (startIndex >= endIndex) {
        return;
    }
    int midIndex = startIndex + (endIndex - startIndex)/2;
    mergeSortHelper(array, startIndex, midIndex);
    mergeSortHelper(array, midIndex + 1, endIndex);
    mergeParts(startIndex, midIndex, endIndex, array);
}

private void mergeParts(int startIndex, int midIndex, int endIndex, int[] array) {
    for (int i = startIndex; i <= endIndex; i++) {
        buffer[i] = array[i];
    }

    int leftIndex = startIndex;
    int rightIndex = midIndex + 1;
    int index = startIndex;
    while (leftIndex <= midIndex && rightIndex <= endIndex && index <= endIndex) {
        if (buffer[leftIndex] <= buffer[rightIndex]) {
            array[index] = buffer[leftIndex];
            leftIndex++;
        } else {
            array[index] = buffer[rightIndex];
            rightIndex++;
        }
        index++;
    }

    while (leftIndex <= midIndex) {
        array[index] = buffer[leftIndex];
        index++;
        leftIndex++;
    }

    while (rightIndex <= endIndex) {
        array[index] = buffer[rightIndex];
        index++;
        rightIndex++;
    }
}

Merge Sort 是 stable 的。
Runtime: Fixed O(n log n).

分析:每一層遞歸中,都需要對所有的 items 進行操作,O(n) 操作。遞歸層數為 O(log n)。

Space Complexity: O(n).

需要額外的 buffer array 來進行合并操作,否則時間復雜度會提高。

這里的解法是 top down,其實也可以使用 bottom up 來解。step 從 1, 2, 4, 8,... 直到 step >= array.length, 進行對應的合并。其時間復雜度和空間復雜度跟上面應該是一樣的。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容