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

C語言冒泡排序函數實現詳解與常見錯誤修正

     編輯:C 語言問答

題目要求

  • 全局數組 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;  // 本趟無交換,已有序,提前結束
    }
}

複雜度與適用場景

  • 時間複雜度:O(n²) 平均/最差,O(n) 最佳(已有序+優化)。
  • 空間複雜度:O(1) 原地排序。
  • 穩定性:穩定(相等元素不交換)。
  • 適用:教學演示、極小規模數據 (n<50)、近乎有序數據。大規模請用 qsort 或快速排序/歸並排序。

總結

正確的冒泡排序關鍵在於雙層循環邊界精確控制(外層 n-1 趟,內層 n-1-i 次比較)與相鄰元素比較交換。避免混淆選擇排序邏輯,注意數組越界風險,並在主函數中做好輸入校驗與提示順序,即可獲得穩定正確的排序結果。

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