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 旗標優化近乎有序情況。