← 回首頁

合併排序法 Merge Sort

觀察「分割陣列」與「合併有序子陣列」的流程,理解分治法如何提升效率。

(4-36個)
中速
未處理
左半部
右半部
比較中
已合併

原陣列 a[]

暫存陣列 reg[](目前合併結果)

C++ 合併排序法參考程式

合併排序使用分治法:先把陣列切小,再把排序好的子陣列合併回去。

C++
#include <iostream>
using namespace std;

void merge_sort_recursive(int a[], int reg[], int start, int end) {
    if (start >= end) return;

    int mid = (start + end) / 2;
    int start1 = start, end1 = mid;
    int start2 = mid + 1, end2 = end;

    merge_sort_recursive(a, reg, start1, end1);
    merge_sort_recursive(a, reg, start2, end2);

    int k = start;
    while (start1 <= end1 && start2 <= end2) {
        reg[k++] = (a[start1] <= a[start2]) ? a[start1++] : a[start2++];
    }

    while (start1 <= end1) reg[k++] = a[start1++];
    while (start2 <= end2) reg[k++] = a[start2++];

    // 把暫存區 reg 的結果寫回原陣列 a
    for (int i = start; i <= end; i++) {
        a[i] = reg[i];
    }
}

int main() {
    int data[] = {7, 2, 9, 1, 5, 3};
    int reg[6] = {0};
    int n = 6;

    merge_sort_recursive(data, reg, 0, n - 1);

    cout << "排序結果: ";
    for (int i = 0; i < n; i++) {
        cout << data[i] << " ";
    }
    cout << endl;

    return 0;
}