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

C 語言排序演算法實戰:冒泡排序對 10 個整數升序排列

     編輯:C 語言問答

冒泡排序核心思想

重複遍歷陣列,比較相鄰元素,順序錯誤則交換。每輪將最大元素「冒泡」到未排序區末尾。

標準實現 (修正原答案邊界錯誤)


#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;
}

關鍵修正點

  1. 內層迴圈邊界:j < n - i - 1。原答案 j=i+1; j 配合 if(a[i]>a[j]) 是選擇排序邏輯,非冒泡排序。冒泡必須比較相鄰元素 arr[j] 和 arr[j+1]。
  2. 交換邏輯:交換 arr[j] 和 arr[j+1]。
  3. 優化標誌 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);

總結

冒泡排序因代碼簡短、邏輯直觀,是入門排序演算法的首選教學案例。掌握「相鄰比較交換」、「邊界收縮」、「提前終止優化」三要素,即可靈活應對面試手寫與考試填空。

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