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

冒泡排序算法原理與 C 語言實現詳解

     編輯:關於C語言

冒泡排序算法原理與 C 語言實現詳解

冒泡排序是最基礎的交換排序算法,通過相鄰元素比較交換,將大元素像氣泡一樣逐步「冒」到序列末端。本文系統講解算法邏輯、運作過程、時間複雜度、穩定性分析,並提供標準 C 實現代碼。

算法基本思想

重複遍歷序列,比較相鄰兩個元素,若順序錯誤(前大後小)則交換。每輪遍歷將當前未排序部分的最大元素移動到正確位置。直到某輪無任何交換,說明已有序。

運作過程圖解(以升序為例)

初始: [5, 1, 4, 2, 8]
第1輪: 比較(5,1)→交換 [1,5,4,2,8]
        比較(5,4)→交換 [1,4,5,2,8]
        比較(5,2)→交換 [1,4,2,5,8]
        比較(5,8)→不交換 → 最大值8已歸位
第2輪: 對前4個元素重複 → 5歸位
第3輪: 對前3個元素重複 → 4歸位
第4輪: 對前2個元素重複 → 2歸位
完成: [1, 2, 4, 5, 8]

時間複雜度分析

情況比較次數交換/移動次數時間複雜度
最好(已有序)n-10O(n)
最壞(逆序)n(n-1)/23n(n-1)/2O(n²)
平均~n²/4~3n²/4O(n²)

**優化**:設置標誌位,若某輪無交換則提前終止,使最好情況達到 O(n)。

穩定性證明

冒泡排序**只交換相鄰元素**,且**僅在嚴格大於時交換**(`a[i] > a[i+1]`)。相等元素不交換,相對順序不變。因此冒泡排序是**穩定排序算法**。

標準 C 語言實現

#include <stdio.h>

#define SIZE 8

void bubble_sort(int a[], int n) {
    int i, j, temp;
    // 外層控制輪數,共 n-1 輪
    for (j = 0; j < n - 1; j++) {
        // 內層對未排序部分兩兩比較,範圍逐輪縮小
        for (i = 0; i < n - 1 - j; i++) {
            if (a[i] > a[i + 1]) { // 升序:前大後小則交換
                temp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp;
            }
        }
    }
}

int main() {
    int number[SIZE] = {95, 45, 15, 78, 84, 51, 24, 12};
    int i;

    printf("排序前: ");
    for (i = 0; i < SIZE; i++) printf("%d ", number[i]);
    printf("\n");

    bubble_sort(number, SIZE);

    printf("排序後: ");
    for (i = 0; i < SIZE; i++) printf("%d ", number[i]);
    printf("\n");
    return 0;
}

優化版:早退出機制

void bubble_sort_optimized(int a[], int n) {
    int i, j, temp;
    bool swapped;
    for (j = 0; j < n - 1; j++) {
        swapped = false;
        for (i = 0; i < n - 1 - j; i++) {
            if (a[i] > a[i + 1]) {
                temp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp;
                swapped = true;
            }
        }
        if (!swapped) break; // 本輪無交換,已有序
    }
}

適用場景與局限

  • ✅ 教學演示、極小數據集(n < 50)。
  • ✅ 近乎有序數據(優化版接近 O(n))。
  • ✅ 需要穩定排序且內存極受限(原地排序,O(1) 空間)。
  • ❌ 大規模數據(O(n²) 太慢)。
  • ❌ 高性能要求場景(優先選擇快排、歸並、堆排)。

總結

冒泡排序雖然效率低,但其「相鄰比較交換、大元素後沉」的直觀邏輯是理解排序算法的絕佳入門。掌握其雙層循環邊界控制(`n-1-j`)、穩定性來源(`>` 而非 `>=`)、優化標誌位技巧,為學習更高級排序打下堅實基礎。

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