int a[100] 存儲待排序數據。void sort(int n) 僅接受元素個數 n,對全局數組前 n 個元素進行降序排序(大到小)。n、讀取數組、調用排序、輸出結果。void sort(int n) {
int i, j, temp;
for (i = 0; i < n - 1; i++) { // 趟數:n-1 趟
for (j = 0; j < n - 1 - i; j++) { // 每趟比較次數遞減
if (a[j] < a[j + 1]) { // 相鄰元素逆序則交換
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
#include <stdio.h>
int a[100]; // 全局數組
void sort(int n) {
int i, j, temp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - 1 - i; j++) {
if (a[j] < a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
int main() {
int n, i;
printf("輸入元素個數 n (1-100): ");
if (scanf("%d", &n) != 1 || n < 1 || n > 100) {
printf("輸入無效\n");
return 1;
}
printf("輸入 %d 個整數: ", n);
for (i = 0; i < n; i++) scanf("%d", &a[i]);
sort(n);
printf("降序排序結果: ");
for (i = 0; i < n; i++) printf("%d ", a[i]);
putchar('\n');
return 0;
}
| 錯誤版本 | 問題 | 後果 | 修正 |
|---|---|---|---|
選擇排序寫法for(i=0;i<n;i++) for(j=i+1;j<n;j++) | 非冒泡邏輯,且交換條件 a[i] 導致不穩定 | 可能產生非預期順序,a[1] 出現 0 | 改用標準冒泡雙層循環 |
邊界條件錯誤for(j=0;j<n-1;j++) for(i=0;i<n-j;i++) | 內層 i<n-j 導致 a[i+1] 最後一輪越界訪問 a[n] | 未定義行為,數據損壞 | 內層條件改為 i < n - j - 1 |
| 主函數輸出提示順序錯誤 | 在讀取 n 前打印「輸出排序」 | 用戶體驗差 | 調整 printf 順序 |
void sort_optimized(int n) {
int i, j, temp, swapped;
for (i = 0; i < n - 1; i++) {
swapped = 0;
for (j = 0; j < n - 1 - i; j++) {
if (a[j] < a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
swapped = 1;
}
}
if (!swapped) break; // 本趟無交換,已有序,提前結束
}
}
qsort 或快速排序/歸並排序。正確的冒泡排序關鍵在於雙層循環邊界精確控制(外層 n-1 趟,內層 n-1-i 次比較)與相鄰元素比較交換。避免混淆選擇排序邏輯,注意數組越界風險,並在主函數中做好輸入校驗與提示順序,即可獲得穩定正確的排序結果。