歸併排序是「分治法」的教科書級應用。核心邏輯為三步走:
此為「自頂向下」遞歸實現;亦可「自底向上」迭代實現(非遞歸版)。
合併兩個有序陣列 sr[i..m] 與 sr[m+1..n] 至 tr[i..n]:
i、j 分別指向兩子序列起始。sr[i] 與 sr[j],較小者拷貝至 tr[k++],對應指針後移。tr。#include <stdio.h>
#include <stdlib.h>
void Merge(int sr[], int tr[], int i, int m, int n) {
int j = m + 1, k = i;
while (i <= m && j <= n)
tr[k++] = (sr[i] < sr[j]) ? sr[i++] : sr[j++];
while (i <= m) tr[k++] = sr[i++];
while (j <= n) tr[k++] = sr[j++];
}
void MergeSort(int arr[], int arr1[], int s, int t) {
if (s == t) {
arr1[s] = arr[s];
} else {
int m = (s + t) / 2;
int arr2[100]; // 臨時陣列,實際應動態分配或傳入全局緩衝區
MergeSort(arr, arr2, s, m);
MergeSort(arr, arr2, m + 1, t);
Merge(arr2, arr1, s, m, t);
}
}
void print(int arr[], int n) {
for (int i = 0; i < n; i++) printf("%d ", arr[i]);
printf("\n");
}
int main() {
int arr[] = {9, 1, 5, 8, 3, 7, 4, 6, 2};
int n = sizeof(arr) / sizeof(arr[0]);
int arr1[100];
printf("排序前:\n"); print(arr, n);
MergeSort(arr, arr1, 0, n - 1);
printf("排序後:\n"); print(arr1, n);
return 0;
}
| 指標 | 數值/特性 |
|---|---|
| 時間複雜度 | O(n log n)(最好/最壞/平均一致) |
| 空間複雜度 | O(n)(需輔助陣列) |
| 穩定性 | 穩定(合併時前序列元素優先) |
| 適用場景 | 大規模資料、外部排序、鏈表排序、需穩定排序場景 |
歸併排序以穩定的 O(n log n) 時間複雜度、優雅的分治結構、天然的並行友好特性,成為工業級排序庫(如 Java Arrays.sort、Python Timsort 核心組件)的基石。掌握其遞歸邊界、合併雙指針、空間權衡是演算法工程化的必修課。