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

C++ 冒泡排序數組越界修復:下標從 0 開始、長度邊界條件修正

     編輯:程式設計綜合問答

原代碼三大錯誤:

  1. int a[11]; int n; ... for(i=1;i —— 下標從 1 開始,a[0] 未初始化,輸入 n 個數只存 n-1 個。
  2. for(j=1;j<=n-1;j++) for(i=0;i<=n-j;i++) —— 內層 i<=n-j 導致 a[i+1] 訪問 a[n] 越界。
  3. n=5 在數組定義**之後**,VLA(可變長數組)非標準 C++,行為未定義。

修正版標準冒泡排序(升序)

#include 
using namespace std;

int main() {
    int n;
    cout << "請輸入數組長度 (≤10): ";
    cin >> n;
    if (n <= 0 || n > 10) return 1;

    int a[10]; // 固定最大長度,或用 vector
    cout << "請輸入 " << n << " 個整數:\n";
    for (int i = 0; i < n; i++) cin >> a[i];

    // 冒泡排序:外層 n-1 趟,內層遞減
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - 1 - i; j++) {
            if (a[j] > a[j + 1]) {
                int t = a[j]; a[j] = a[j + 1]; a[j + 1] = t;
            }
        }
    }

    cout << "排序後:\n";
    for (int i = 0; i < n; i++) cout << a[i] << ' ';
    cout << '\n';
    return 0;
}

關鍵修正對照表

原代碼問題修正
for(i=1;i<n;i++)跳過 a[0]for(i=0;i<n;i++)
i<=n-ja[i+1] 越界i<n-1-j 即 j<n-1-i
int a[11]; n=5;VLA 非標準定義固定大小或用 vector a(n)
cout<<a[i]<<\"\\n\"每行一個數cout<<a[i]<<' ' 同行空格分隔

現代 C++ 寫法

#include 
#include 
#include 
int main() {
    int n; cin >> n;
    vector a(n);
    for (int &x : a) cin >> x;
    sort(a.begin(), a.end()); // 標準庫 O(n log n)
    for (int x : a) cout << x << ' ';
}

記住:C++ 下標從 0 開始,循環邊界寬嚴慎(< 而非 ≤),優先用標準庫算法,手寫排序僅供教學驗證。

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