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

C++ 冒泡排序邊界條件錯誤:內層迴圈上限應為 9-j 而非 10-j

     編輯:程式設計疑難解答

錯誤代碼

for (j = 0; j < 9; j++)
    for (i = 0; i < 10 - j; i++) // ❌ 當 j=0, i=9 時 a[i+1] 讀取 a[10] 越界
        if (a[i] > a[i+1]) swap(a[i], a[i+1]);

修正邏輯

每輪冒泡將**最大值推至末尾**,第 j 輪(從 0 開始)後,最後 j+1 個元素已有序。內層掃描範圍為 [0, n-2-j],即 i < n-1-j。

正確代碼

#include 
using namespace std;

int main() {
    int a[10], i, j, t;
    cout << "input 10 numbers:" << endl;
    for (i = 0; i < 10; i++) cin >> a[i];

    for (j = 0; j < 9; j++)           // 9 輪比較
        for (i = 0; i < 9 - j; i++)   // ✅ 修正:i < 9-j,避免 a[10] 越界
            if (a[i] > a[i+1]) {
                t = a[i]; a[i] = a[i+1]; a[i+1] = t;
            }

    cout << "the sorted numbers:" << endl;
    for (i = 0; i < 10; i++) cout << a[i] << " ";
    cout << endl;
    return 0;
}

優化:提前結束旗標

bool swapped;
for (j = 0; j < 9; j++) {
    swapped = false;
    for (i = 0; i < 9 - j; i++)
        if (a[i] > a[i+1]) { swap(a[i], a[i+1]); swapped = true; }
    if (!swapped) break; // 本輪無交換,已有序
}

複雜度與特性

項目數值
時間複雜度O(n²)(最好 O(n) 配合旗標)
空間複雜度O(1)
穩定性穩定(相等不交換)
適用場景教學、極小資料量、近乎有序資料

總結

冒泡排序內層迴圈上限**必須是 n-1-j**,否則會陣列越界導致未定義行為。養成「邊界條件寫在臉上」的習慣,並加上 swapped 旗標優化近乎有序情況。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved