首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

HDU 杭電 OJ 入門題:整數按絕對值降序排序 C 語言完整解法

     編輯:程式設計疑難解答

題目需求

  • 輸入多組測試數據,每行首數 n(n≤100),後跟 n 個整數
  • 按絕對值從大到小排序輸出
  • 保證同一測試實例中所有數的絕對值互不相等
  • n=0 結束輸入

原代碼問題分析

用戶代碼存在邊界條件判斷重複導致最後一個數字輸出兩次:

// 原錯誤邏輯
if (q != n) { printf("%d ", c[q]); }
if (q == (n-1)) { printf("%d\n", c[q]); }
// 當 q == n-1 時,兩個條件均成立,輸出兩次

修正後的完整代碼

#include <stdio.h>
#include <stdlib.h>

// 絕對值比較函數(用於 qsort)
int cmp_abs_desc(const void *a, const void *b) {
    int val1 = *(const int *)a;
    int val2 = *(const int *)b;
    int abs1 = abs(val1);
    int abs2 = abs(val2);
    return (abs2 - abs1); // 降序:大的在前
}

int main() {
    int n;
    int a[100];
    
    while (scanf("%d", &n) != EOF) {
        if (n == 0) break; // 遇到 0 結束
        
        // 讀入 n 個整數
        for (int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
        }
        
        // 排序
        qsort(a, n, sizeof(int), cmp_abs_desc);
        
        // 輸出:空格分隔,行尾換行
        for (int i = 0; i < n; i++) {
            if (i == n - 1) {
                printf("%d\n", a[i]); // 最後一個加換行
            } else {
                printf("%d ", a[i]);  // 其他加空格
            }
        }
    }
    return 0;
}

關鍵改進點

  1. 使用標準庫 qsort:替代手寫選擇排序,代碼簡潔、性能優、不易出錯
  2. 比較函數分離:cmp_abs_desc 專注絕對值降序邏輯,可復用
  3. 邊界條件簡化:單一循環內用 i == n-1 區分最後一個元素
  4. 輸入結束正確判斷:while (scanf(...) != EOF && n != 0) 或循環內 if (n==0) break
  5. 變量作用域最小化:循環變量在 for 中聲明,避免殘留值干擾

測試驗證

輸入:
3 3 -4 2
4 0 1 2 -3
0

程序輸出:
-4 3 2
-3 2 1 0

符合預期 Sample Output。

進階:手寫排序算法(教學用)

若要求不使用 qsort,正確的選擇排序實現:

// 選擇排序:每輪選最大絕對值放到已排序區末尾
for (int i = 0; i < n - 1; i++) {
    int maxIdx = i;
    for (int j = i + 1; j < n; j++) {
        if (abs(a[j]) > abs(a[maxIdx])) {
            maxIdx = j;
        }
    }
    // 交換
    if (maxIdx != i) {
        int temp = a[i];
        a[i] = a[maxIdx];
        a[maxIdx] = temp;
    }
}

避坑清單

  • ❌ abs() 需包含 <stdlib.h>(C 標準庫)
  • ❌ abs(INT_MIN) 未定義行為(本題數據範圍安全)
  • ❌ 手寫排序邊界寫錯(j < n vs j <= n)
  • ❌ 輸出格式多空格/少換行導致格式錯誤
  • ❌ 未處理 n=0 結束條件導致死循環
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved