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

C 語言經典題解:三字元 ASCII 碼排序 (簡單選擇排序/交換排序)

     編輯:關於C

題目:ASCII碼的排序

輸入三個字符 (無空格),按 ASCII 碼從小到大輸出,字符間用空格分隔。多組測資 (EOF 結束)。

解法:三元素排序 — 兩兩比較交換

僅三個元素,直接用 **3 次比較交換** 即可完成排序 (類似冒泡/選擇排序的精簡版)。

完整解答

#include 

int main() {
    char a, b, c, t;

    // 讀取三字符 (跳過空白/換行)
    while (scanf(" %c %c %c", &a, &b, &c) == 3) {  // 關鍵: 格式字串前加空白跳過 \n
        // 選擇排序網路 (Sorting Network for 3 elements)
        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("%c %c %c\n", a, b, c);
    }
    return 0;
}

關鍵細節

細節說明
輸入格式題目說「三個字符組成,之間無空格」,如 qwe。但 scanf("%c%c%c") 會讀入換行符。解法:scanf(" %c %c %c") — 格式字串前的空白自動跳過所有空白字元 (含 \n、空格、\t)。
排序網路固定 3 次比較交換,無迴路,極致簡潔。對應比較器網路:(a,b) → (a,c) → (b,c)。
ASCII 碼順序數字 < 大寫字母 < 小寫字母。'0'=48, 'A'=65, 'a'=97。
EOF 結束scanf(...) == 3 同時處理 EOF 與格式錯誤。

測試案例

輸入輸出ASCII 碼
qwee q w101 113 119
asda d s97 100 115
zxcc x z99 120 122
CBAA B C65 66 67
9a11 9 a49 57 97

延伸:通用 qsort 版本 (可擴充至 N 個)

#include 

int cmp_char(const void *p1, const void *p2) {
    return *(const char*)p1 - *(const char*)p2;
}

int main() {
    char arr[100];
    int n = 0;
    int ch;
    while ((ch = getchar()) != EOF) {
        if (ch != '\n' && ch != ' ' && ch != '\t') {
            arr[n++] = ch;
        } else if (n > 0) {
            qsort(arr, n, 1, cmp_char);
            for (int i = 0; i < n; i++) {
                putchar(arr[i]);
                if (i < n-1) putchar(' ');
            }
            putchar('\n');
            n = 0;
        }
    }
    return 0;
}

常見錯誤

  • scanf("%c%c%c") 讀到上一行殘留的 \n → 輸出亂碼。**必須加空白跳過空白字元**。
  • 使用 gets / fgets 讀整行再處理,較繁瑣但也可行。
  • 排序邏輯錯誤:只比較相鄰、未確保全域有序。
  • 輸出格式:缺空格、多空格、缺換行。

總結

三元素排序是**排序網路**的最小非平凡案例。掌握 scanf(" %c") 跳過空白字元的技巧,對處理字符輸入類 OJ 題至關重要。固定比較次數的排序網路在嵌入式、GPU、硬體實現中極具價值 (無分支預測失誤、固定延遲)。

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