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

C語言冒泡排序算法原理、代碼實現與優化版本

     編輯:C 語言基礎

什麼是冒泡排序?

冒泡排序是最經典的入門排序算法,名稱由來:較大的元素像氣泡一樣通過交換逐漸「浮」到數列末端。雖然效率較低,但邏輯清晰,是教學首選。

算法基本思想

  • 重複遍歷數組,比較相鄰元素
  • 若前者大於後者(升序),交換它們
  • 每輪遍歷將當前未排序部分的最大元素「冒泡」到正確位置
  • 共需 n-1 輪,每輪比較次數遞減

逐輪演示(以 3 2 4 1 為例)

輪次比較過程輪次結果說明
13↔2, 3-4, 4↔12 3 1 4最大值 4 到達末尾
22-3, 3↔12 1 3 4次大值 3 到達倒數第二
32↔11 2 3 4完成排序

完整 C 語言代碼實現(標準版 + 優化版)

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define N 8

// 標準冒泡排序:固定執行 n-1 輪
void bubbleSort(int a[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - 1 - i; j++) {
            if (a[j] > a[j + 1]) {
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }
}

// 優化版:若某輪無交換,說明已有序,提前結束
void bubbleSortBetter(int a[], int n) {
    for (int i = 0; i < n - 1; i++) {
        bool isSorted = true;
        for (int j = 0; j < n - 1 - i; j++) {
            if (a[j] > a[j + 1]) {
                isSorted = false;
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
        if (isSorted) break;  // 提前退出
    }
}

int main() {
    int num[N] = {89, 38, 11, 78, 96, 44, 19, 25};
    
    // bubbleSort(num, N);           // 標準版
    bubbleSortBetter(num, N);      // 優化版
    
    printf("排序結果:\n");
    for (int i = 0; i < N; i++) printf("%d ", num[i]);
    printf("\n");
    return 0;
}

運行結果

排序結果:11 19 25 38 44 78 89 96

算法特性分析

特性標準版優化版
最好時間複雜度O(n²)O(n)(已有序)
平均/最壞時間複雜度O(n²)O(n²)
空間複雜度O(1)O(1)
穩定性穩定穩定

進一步優化:雞尾酒排序

雙向冒泡:奇數輪從左向右冒泡最大值,偶數輪從右向左冒泡最小值,可進一步減少遍歷次數,適合「小數據在右端、大數據在左端」的數據分佈。

適用場景與總結

  • 教學演示、極小數據量(n < 20)
  • 近乎有序數據(優化版極快)
  • 嵌入式系統、空間極度受限場景
  • 實際工程中大數據量請勿使用,改用快速排序、歸並排序或堆排序
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved