歸並排序採用 分治法:
時間複雜度穩定 O(n log n),空間複雜度 O(n),屬穩定排序。
void Merge(int array[], int left, int mid, int right) {
int aux[Max_] = {0}; // 暫存陣列
int i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right) {
if (array[i] < array[j]) aux[k++] = array[i++];
else aux[k++] = array[j++];
}
while (i <= mid) aux[k++] = array[i++];
while (j <= right) aux[k++] = array[j++];
for (i = left, k = 0; i <= right; i++, k++)
array[i] = aux[k];
}
void MergeSort(int array[], int start, int end) {
if (start < end) {
int mid = (start + end) / 2;
MergeSort(array, start, mid);
MergeSort(array, mid + 1, end);
Merge(array, start, mid, end);
}
}
#include
#define MAX_N 10
void Show(int arr[], int n) {
for (int i = 0; i < n; i++) printf("%d ", arr[i]);
puts("");
}
int main() {
int arr[MAX_N] = {8, 4, 2, 3, 5, 1, 6, 9, 0, 7};
printf("排序前: "); Show(arr, MAX_N);
MergeSort(arr, 0, MAX_N - 1);
printf("排序後: "); Show(arr, MAX_N);
return 0;
}
#pragma omp task。| 錯誤現象 | 可能原因 | 檢查重點 |
|---|---|---|
| 結果未完全排序 | 合併邊界條件錯誤 | mid 計算、i <= mid vs i < mid |
| 陣列越界 | 暫存陣列大小不足 | aux 長度需 ≥ right-left+1 |
| 遞迴無限深 | 終止條件缺失 | if (start < end) 必須嚴格 |