輸入 5 4 3 2 1,輸出 1 2 3 0 0,最後兩個元素歸零,資料遺失。
合併階段處理剩餘元素時使用 if 而非 while,導致每次最多複製一個元素:
// 錯誤寫法
if (i <= mid) { s[k++] = a[i++]; }
if (j <= end) { s[k++] = a[j++]; }
當其中一陣列已合併完畢,另一陣列仍有多個元素時,僅複製第一個,其餘遺漏。
// 正確寫法:使用 while 循環複製所有剩餘元素
while (i <= mid) { s[k++] = a[i++]; }
while (j <= end) { s[k++] = a[j++]; }
#include <stdio.h>
#include <stdlib.h>
void merge(int *dest, const int *src, int start, int mid, int end) {
int i = start, j = mid + 1, k = start;
while (i <= mid && j <= end) {
dest[k++] = (src[i] < src[j]) ? src[i++] : src[j++];
}
while (i <= mid) dest[k++] = src[i++];
while (j <= end) dest[k++] = src[j++];
}
void merge_sort(int *dest, const int *src, int start, int end) {
if (start == end) { dest[start] = src[start]; return; }
int mid = (start + end) / 2;
int *temp = malloc((end - start + 1) * sizeof(int));
merge_sort(temp, src, start, mid);
merge_sort(temp, src, mid + 1, end);
merge(dest, temp, start, mid, end);
free(temp);
}
int main() {
int n = 5, a[] = {5,4,3,2,1}, s[5];
merge_sort(s, a, 0, n-1);
for (int i = 0; i < n; i++) printf("%d ", s[i]);
return 0;
}
int a[n] 為 C99 VLA,建議改用 malloc 提升相容性。log2(n),大資料量注意堆疊溢位。