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

C 語言數組排序算法大全:冒泡、選擇、計數排序與優化技巧

     編輯:關於C語言

C 語言數組排序算法大全:冒泡、選擇、計數排序與優化技巧

排序是演算法入門必修課。本文展示四種針對整型數組的排序實現,從經典冒泡、選擇排序,到利用「統計頻率」的計數排序(線性時間),並演示無臨時變量交換(XOR 交換)技巧。

1. 冒泡排序(固定最大值沉底)

void bubble_sort(int a[], int n) {
    for (int i=0; i a[j+1]) {
                a[j] ^= a[j+1];
                a[j+1] ^= a[j];
                a[j] ^= a[j+1]; // XOR 交換,無需 temp
            }
}

時間複雜度 O(n²),穩定,原地排序。XOR 交換避免臨時變量,但現代編譯器優化下 temp 寫法同樣高效且可讀性更好。

2. 選擇排序(每輪選最小值放前)

void selection_sort(int a[], int n) {
    for (int i=0; i a[j]) {
                a[i] ^= a[j];
                a[j] ^= a[i];
                a[i] ^= a[j];
            }
}

同為 O(n²),不穩定,交換次數少(最多 n-1 次),適合寫入成本高的存儲介質。

3. 計數排序(統計頻率,線性時間)

void counting_sort(int a[], int n, int max_val) {
    int *cnt = calloc(max_val+1, sizeof(int));
    for (int i=0; i

適用於**數值範圍已知且較小**(如 0-100 分數)的整型排序,時間 O(n+k),空間 O(k),穩定。示例中對 10 個 0-100 分數排序。

4. 快速排序(標準庫 qsort 封裝)

int cmp(const void* a, const void* b) { return *(int*)a - *(int*)b; }
qsort(arr, n, sizeof(int), cmp);

工程實踐中**首選 qsort** 或 C++ std::sort,平均 O(n log n)、高度優化、經過測試。

算法選型速查表

算法時間空間穩定適用場景
冒泡O(n²)O(1)是教學、極小數據、近乎有序
選擇O(n²)O(1)否寫入昂貴、記憶體受限
插入O(n²)O(1)是小規模、近乎有序、在線排序
計數O(n+k)O(k)是整數、範圍小、已知上下界
快速/歸併/堆O(n log n)O(log n)/O(n)/O(1)否/是/否通用大規模排序

進階優化提示

  • 小區間(< 16)改用插入排序(qsort 內部常做)。
  • 三數取中選主元、尾遞歸消除、雙向分區(Yaroslavskiy 分區)提升快排穩健性。
  • 關鍵字排序(Radix Sort)處理定長鍵值可達 O(n)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved