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

三數排序與倒三角列印:三種演算法對比與實作

     編輯:關於C

問題一:三整數升序排列

輸入 a, b, c 三個整數,按升序輸出。展示三種不同思路的演算法。

方法一:窮舉所有排列組合(6 條件分支)

if (a <= b && b <= c) printf("%d %d %d\n", a, b, c);
else if (a <= c && c <= b) printf("%d %d %d\n", a, c, b);
else if (b <= a && a <= c) printf("%d %d %d\n", b, a, c);
else if (b <= c && c <= a) printf("%d %d %d\n", b, c, a);
else if (c <= a && a <= b) printf("%d %d %d\n", c, a, b);
else /* c <= b && b <= a */ printf("%d %d %d\n", c, b, a);
  • 優點:邏輯直觀,直接對應數學定義
  • 缺點:分支過多,擴展性差(n 數需 n! 分支),程式碼冗長

方法二:兩兩比較交換(選擇排序思想)

if (a > b) { t = a; a = b; b = t; }  // 確保 a <= b
if (a > c) { t = a; a = c; c = t; }  // 確保 a 是最小
if (b > c) { t = b; b = c; c = t; }  // 確保 b <= c
printf("%d %d %d\n", a, b, c);
  • 優點:程式碼簡潔,邏輯清晰,易擴展為氣泡/選擇排序
  • 缺點:固定 3 次比較,未利用已知關係優化

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

x = a;  // 最小值
if (b < x) x = b;
if (c < x) x = c;

z = a;  // 最大值
if (b > z) z = b;
if (c > z) z = c;

y = a + b + c - x - z;  // 中間值 = 總和 - 最小 - 最大
printf("%d %d %d\n", x, y, z);
  • 優點:僅需 4 次比較(最小 2 次 + 最大 2 次),無交換操作,數學優雅
  • 缺點:依賴整數加法不溢位,浮點數會有精度問題

三方法比較總結

指標方法一方法二方法三
比較次數最多 5 次固定 3 次固定 4 次
交換/賦值無最多 3 次極值各 2 次
程式碼長度最長中等最短
擴展性極差良好差(需加總)
適用類型任意可比較任意可比較/交換數值型(支援加減)

推薦:一般情況用方法二(平衡清晰度與效能);嚴格效能敏感且確定為整數用方法三。


問題二:倒三角星號列印

輸入 n (≤30),輸出 n 層倒三角。n=5 範例:

* * * * *
 * * * *
  * * *
   * *
    *

實作邏輯

  • 第 t 行(t 從 n 遞減至 1):
    • 前導空格:2 × (n - t) 個字元(每層縮進 2 格)
    • 星號數:2×t - 1 個,每顆星後跟一空格

C 語言實作

#include <stdio.h>

int main() {
    int n, t, j, k;
    scanf("%d", &n);
    
    for (t = n; t >= 1; t--) {
        // 印前導空格(每層 2 字元寬度)
        for (k = n - t; k > 0; k--) {
            printf("  ");  // 兩個空格
        }
        // 印星號
        for (j = 2*t - 1; j >= 1; j--) {
            printf("* ");
        }
        printf("\n");
    }
    return 0;
}

關鍵點解析

  1. 雙重迴圈結構:外層控制行,內層分別處理空格與星號
  2. 空格計算:`n - t` 為當前層相對頂層的縮進層數
  3. 星號計算:等差數列 2t-1,t=n→2n-1, t=1→1
  4. 格式控制:`printf("* ")` 確保星號間距;`printf(" ")` 雙空格對齊

常見變體

  • 不帶空格的緊湊倒三角:`printf("*")`,空格數調整為 `n-t`
  • 置中倒三角:前導空格 = `n-t`,星號 = `2*t-1`
  • 空心倒三角:只印首尾星號

這兩道題目涵蓋了基礎排序邏輯與幾何圖形列印,是程式設計入門的核心訓練項目。

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