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

C語言排序算法對比:冒泡排序與選擇排序的原理、穩定性與性能差異

     編輯:C 語言問答

核心差異總表

維度冒泡排序選擇排序
基本思想相鄰比較,大者後移(氣泡上浮)每輪選出最小/最大,換到有序區末尾
交換次數多(每次比較可能交換)少(每輪僅 1 次交換)
穩定性穩定(相等元素不交換順序)不穩定(交換可能改變相等元素相對位置)
時間複雜度O(n²) 最好 O(n)(優化版)O(n²) 固定,無最好情況優化
空間複雜度O(1)O(1)
適用場景小規模、近乎有序、需穩定排序小規模、交換成本高(如大結構體)、不要求穩定

冒泡排序詳解

void bubble_sort(int a[], int n) {
    for (int i = 0; i < n-1; ++i) {
        int swapped = 0;
        for (int j = 0; j < n-1-i; ++j) {
            if (a[j] > a[j+1]) {
                int t = a[j]; a[j] = a[j+1]; a[j+1] = t;
                swapped = 1;
            }
        }
        if (!swapped) break; // 優化:本輪無交換提前結束
    }
}
  • 機制:每輪將當前無序區最大值「冒泡」到末尾。
  • 穩定:只在 > 時交換,相等不動,保持相對順序。

選擇排序詳解

void selection_sort(int a[], int n) {
    for (int i = 0; i < n-1; ++i) {
        int min_idx = i;
        for (int j = i+1; j < n; ++j)
            if (a[j] < a[min_idx]) min_idx = j;
        if (min_idx != i) {
            int t = a[i]; a[i] = a[min_idx]; a[min_idx] = t;
        }
    }
}
  • 機制:每輪在無序區掃描最小值,與無序區首位交換。
  • 不穩定:例 [5a, 5b, 3] → 首輪 3 與 5a 交換 → [3, 5b, 5a],相等元素順序顛倒。

性能實測提示

對於 n < 50 的小數據量,兩者差異可忽略;大數據量必須用 O(n log n) 算法(快排、歸併、堆排、qsort)。

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