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

三數排序演算法對決:暴力枚舉、三輪交換、極值法與倒三角列印實戰

     編輯:關於C語言

問題:輸入三整數 a, b, c,升序輸出

方法一:暴力枚舉 6 種排列(教學用)

if (a <= b && b <= c) printf("%d %d %d", a, b, c);
else if (a <= c && c <= b) printf("%d %d %d", a, c, b);
else if (b <= a && a <= c) printf("%d %d %d", b, a, c);
else if (b <= c && c <= a) printf("%d %d %d", b, c, a);
else if (c <= a && a <= b) printf("%d %d %d", c, a, b);
else printf("%d %d %d", c, b, a);
  • ✅ 邏輯直觀、無交換操作
  • ❌ 分支過多、擴展性極差 (n! 條件)

方法二:三輪兩兩比較交換(推薦通用)

int t;
if (a > b) { t = a; a = b; b = t; }  // 確保 a ≤ b
if (a > c) { t = a; a = c; c = t; }  // 確保 a ≤ c (a 為最小)
if (b > c) { t = b; b = c; c = t; }  // 確保 b ≤ c
printf("%d %d %d", a, b, c);
  • ✅ 邏輯清晰:選擇排序 思想,固定 3 次比較、最多 3 次交換
  • ✅ 易擴展為陣列排序
  • ✅ 無溢位風險

方法三:極值法(數學技巧)

int x = a, z = a;  // x=最小, z=最大
if (b < x) x = b; if (c < x) x = c;
if (b > z) z = b; if (c > z) z = c;
int y = a + b + c - x - z;  // 中間值 = 總和 - 最小 - 最大
printf("%d %d %d", x, y, z);
  • ✅ 僅比較、無交換、無臨時變數 (除極值變數)
  • ⚠️ 溢位風險:a+b+c 可能超出 int 範圍
  • ⚠️ 僅適用數值型別

效能與適用性對比

方法比較次數交換/賦值溢位風險型別通用性推薦場景
暴力枚舉最多 5 條件判斷0無所有可比較教學、極小 n
三輪交換3≤3無所有可比較/交換通用首選
極值法44 賦值高 (求和)數值型別嵌入式/寄存器受限

附錄:倒三角形列印 (n 層)

/* 輸入 n=5
* * * * *
  * * * *
    * * *
      * *
        *
*/
#include 

int main() {
    int n;
    scanf("%d", &n);
    for (int row = n; row >= 1; row--) {
        // 前導空格:每層遞增 2 字元 (對齊 "* ")
        for (int s = 0; s < n - row; s++) printf("  ");
        // 星號:每行 2*row-1 個,間隔空格
        for (int k = 0; k < 2 * row - 1; k++) printf("* ");
        putchar('\n');
    }
    return 0;
}

倒三角幾何規律

  • 第 i 行 (1-based, 從上往下):n-i 組前導空格,2*i-1 個星號
  • 或反向迴圈 row = n..1:前導 n-row,星號 2*row-1
  • 星號間空格確保對齊視覺寬度一致

面試延伸題

  1. 不使用臨時變數交換:XOR 交換 (整數)、算術交換 (風險)
  2. 擴展至 N 數排序:選擇/插入/快速排序,qsort 標準庫
  3. 三數中位數:mid = a + b + c - min(a,b,c) - max(a,b,c) (同極值法)
  4. 硬體實現:比較器網路、排序網路
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved