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

C 語言排序基礎:三數由小到大排序的交換邏輯與邊界測試

     編輯:關於C語言

問題描述

輸入三個整數 a, b, c,按從小到大順序輸出。核心考點:兩兩比較交換、排序網絡最優比較次數、變量命名規範。

標準實現:三次比較交換


#include 

int main() {
    int a, b, c, t;
    printf("請輸入 a b c: ");
    scanf("%d %d %d", &a, &b, &c);

    // 確保 a <= b
    if (a > b) { t = a; a = b; b = t; }
    // 確保 a <= c (a 為最小)
    if (a > c) { t = a; a = c; c = t; }
    // 確保 b <= c
    if (b > c) { t = b; b = c; c = t; }

    printf("排序結果: %d %d %d\n", a, b, c);
    return 0;
}

邏輯證明:決策樹深度 = 3

三元素全排列 3! = 6 種。比較決策樹葉子 ≥ 6 → 深度 ≥ log₂6 ≈ 2.58 → **至少 3 次比較**。本算法恰好 3 次,屬於**最優比較排序網絡**。

執行軌跡示例:輸入 3 1 2

初始: a=3, b=1, c=2
1) a>b (3>1) → 交換: a=1, b=3, c=2
2) a>c (1>2) 偽 → 無交換: a=1, b=3, c=2
3) b>c (3>2) → 交換: a=1, b=2, c=3
結果: 1 2 3 ✓

宏封裝交換操作


#define SWAP(x, y) do { typeof(x) tmp = x; x = y; y = tmp; } while(0)
// typeof 是 GNU 擴展,標準 C 需針對類型定義
#define SWAP_INT(x, y) do { int tmp = x; x = y; y = tmp; } while(0)

if (a > b) SWAP_INT(a, b);
if (a > c) SWAP_INT(a, c);
if (b > c) SWAP_INT(b, c);

邊界測試用例

輸入預期輸出測試點
3 2 11 2 3逆序
1 2 31 2 3已排序
2 2 11 2 2含重複值
-5 0 5-5 0 5負數
2147483647 -2147483648 0-2147483648 0 2147483647int 極值
100 100 100100 100 100全等

擴展:通用 N 元素排序 (qsort)


#include 

int cmp_asc(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

void sort_array(int *arr, int n) {
    qsort(arr, n, sizeof(int), cmp_asc);
}

總結

三數排序是「最優比較網絡、交換宏、決策樹下界」的微型教科書。關鍵收穫:

  • 固定 3 元素,**3 次比較為理論最優**,無法再減;
  • 邏輯順序:先定最小 (a),再定中間 (b),最後最大 (c) 自定;
  • SWAP 宏用 do{}while(0) 包裹防語法陷阱;
  • 通用排序**首選標準庫 qsort**,僅極致性能場景手寫專用網絡;
  • 測試用例必覆蓋:逆序、已序、重複、負數、極值、全等。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved