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

C 語言經典排序算法:選擇排序與冒泡排序完整實現詳解

     編輯:關於C語言

題目需求

輸入 10 個整數,按從大到小順序排序輸出。輸入範例:2 0 3 -4 8 9 5 1 7 6,期望輸出:9 8 7 6 5 3 2 1 0 -4。

算法一:選擇排序

核心思想:每輪從未排序區間選出最大值,與區間首位交換。雙層循環,外層控制輪數,內層尋找最大值索引。

#include <stdio.h>

int main() {
    int num[10], i, j, k, temp;
    for (i = 0; i <= 9; i++) scanf("%d", &num[i]);
    for (j = 0; j < 9; j++) {
        for (k = j + 1; k <= 9; k++) {
            if (num[j] < num[k]) { // 降序:前者小於後者則交換
                temp = num[j];
                num[j] = num[k];
                num[k] = temp;
            }
        }
    }
    for (i = 0; i <= 9; i++) printf("%d ", num[i]);
    return 0;
}

時間複雜度 O(n²),交換次數最少(最多 n-1 次),適合數據移動成本高的場景。

算法二:冒泡排序

核心思想:相鄰元素兩兩比較,大者「沉底」、小者「冒頂」。每輪將當前未排序區間的最小值移至末尾。

#include <stdio.h>

int main() {
    int num[10], i, j, k, temp;
    for (i = 0; i <= 9; i++) scanf("%d", &num[i]);
    for (j = 0; j < 9; j++) {
        for (k = 0; k < 9 - j; k++) {
            if (num[k] < num[k + 1]) { // 降序:前者小於後者交換
                temp = num[k];
                num[k] = num[k + 1];
                num[k + 1] = temp;
            }
        }
    }
    for (i = 0; i <= 9; i++) printf("%d ", num[i]);
    return 0;
}

時間複雜度同為 O(n²),但交換次數較多。優勢在於代碼簡潔、易於理解,且可通過標誌位優化已排序序列的最佳情況至 O(n)。

對比與選擇建議

特性選擇排序冒泡排序
比較次數固定 n(n-1)/2固定 n(n-1)/2
交換次數最多 n-1 次最多 n(n-1)/2 次
穩定性不穩定穩定
適用場景數據移動昂貴、小規模數據教學演示、近乎有序數據

實際工程中小規模數據推薦插入排序,大規模首選快速排序、歸併排序或標準庫 qsort。

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