重複遍歷陣列,比較相鄰元素,順序錯誤則交換。每輪將最大元素「冒泡」到未排序區末尾。
#include <stdio.h>
#define N 10
void bubble_sort(int arr[], int n) {
int i, j, temp;
bool swapped; // 優化標誌
for (i = 0; i < n - 1; i++) {
swapped = false;
// 內層:未排序區 [0, n-i-1]
for (j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) { // 相鄰比較
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
if (!swapped) break; // 本輪無交換,已有序,提前結束
}
}
int main() {
int arr[N];
printf("請輸入 %d 個整數:\n", N);
for (int i = 0; i < N; i++) {
printf("第 %d 個: ", i + 1);
while (scanf("%d", &arr[i]) != 1) { // 輸入驗證
printf("輸入無效,請重新輸入整數: ");
while (getchar() != '\n');
}
}
bubble_sort(arr, N);
printf("排序結果 (升序): ");
for (int i = 0; i < N; i++) printf("%d ", arr[i]);
printf("\n");
return 0;
}
j < n - i - 1。原答案 j=i+1; j 配合 if(a[i]>a[j]) 是選擇排序邏輯,非冒泡排序。冒泡必須比較相鄰元素 arr[j] 和 arr[j+1]。 arr[j] 和 arr[j+1]。swapped:最好情況 (已有序) 達到 O(n)。| 指標 | 結果 | 說明 |
|---|---|---|
| 時間 (最壞/平均) | O(n²) | 逆序/亂序 |
| 時間 (最好) | O(n) | 已有序 (含優化標誌) |
| 空間 | O(1) | 原地排序 |
| 穩定性 | 穩定 | 相等元素不交換,相對順序不變 |
學習演算法原理請手寫冒泡/選擇/插入/快排/歸併/堆排。**實際專案請直接使用標準庫** :
// C 標準庫 qsort (快速排序,平均 O(n log n))
#include <stdlib.h>
int cmp_int(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
qsort(arr, N, sizeof(int), cmp_int);
冒泡排序因代碼簡短、邏輯直觀,是入門排序演算法的首選教學案例。掌握「相鄰比較交換」、「邊界收縮」、「提前終止優化」三要素,即可靈活應對面試手寫與考試填空。