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

C 語言經典排序算法深度解析:冒泡、選擇、插入排序

     編輯:C 語言基礎

排序基礎

將無序序列重排為有序(升序/降序)。以 5 元素降序為例演示三種基礎算法。

1. 冒泡排序

核心思想

相鄰比較,大值「冒泡」上浮。每輪將當前最小值沉底,下輪比較次數 -1。

演示過程

初始: 7 5 8 6 9
第1輪: 7 8 6 9 | 5  (5沉底)
第2輪: 8 7 9 | 6 5  (6沉底)
第3輪: 8 9 | 7 6 5  (7沉底)
第4輪: 9 | 8 7 6 5  (完成)

代碼與優化

// 基礎版
for (i=0; i<n-1; i++)
  for (j=0; j<n-1-i; j++)
    if (a[j] < a[j+1]) swap(a[j], a[j+1]);

// 優化版:提前終止標記
for (i=0; i<n-1 && !sorted; i++) {
    sorted = 1;
    for (j=0; j<n-1-i; j++)
      if (a[j] < a[j+1]) { swap(a[j], a[j+1]); sorted = 0; }
}

2. 選擇排序

核心思想

每輪在未排部分選最大值,與輪首位置交換。比較次數同冒泡,但**交換次數極少**(每輪至多 1 次)。

演示過程

初始: 7 5 8 6 9
第1輪: 9 5 8 6 | 7  (9歸位)
第2輪: 9 8 5 6 | 7  (8歸位)
第3輪: 9 8 7 | 6 5  (7歸位)
第4輪: 9 8 7 6 | 5  (完成)

代碼與優化

// 基礎版
for (i=0; i<n-1; i++)
  for (j=i+1; j<n; j++)
    if (a[i] < a[j]) swap(a[i], a[j]);

// 優化版:記錄最大值索引,僅交換一次
for (i=0; i<n-1; i++) {
    int maxIdx = i;
    for (j=i+1; j<n; j++)
      if (a[maxIdx] < a[j]) maxIdx = j;
    if (maxIdx != i) swap(a[i], a[maxIdx]);
}

3. 插入排序

核心思想

維護有序前缀,將下一元素插入適當位置。類似整理撲克牌,對**近乎有序**數據極快(接近 O(N))。

代碼

for (i=1; i<n; i++) {
    int key = a[i], j = i-1;
    while (j >= 0 && a[j] < key) {  // 降序
        a[j+1] = a[j];
        j--;
    }
    a[j+1] = key;
}

三算法對比

算法平均時間最好情況最壞情況空間穩定性適用場景
冒泡O(N²)O(N)O(N²)O(1)穩定教學、極小數據
選擇O(N²)O(N²)O(N²)O(1)不穩定交換代價大時
插入O(N²)O(N)O(N²)O(1)穩定小規模、近乎有序

實際工程中大數據量首選 O(N log N) 算法(快排、歸併、堆排)。

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