首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言合併排序 Bug 修正:邊界條件導致資料遺失

     編輯:程式設計綜合問答

錯誤現象

輸入 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),大資料量注意堆疊溢位。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved