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

ACM 題目解析:絕對值排序(山東理工大學 1231)

     編輯:關於C語言

題目大意

輸入多組測資,每組第一個數 n (n≤100) 後接 n 個整數。依絕對值從大到小排序輸出,題目保證絕對值互不相同。n=0 結束輸入。

輸入輸出範例

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

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

解題思路

  1. 讀取 n,若為 0 則結束。
  2. 讀入 n 個整數存入陣列。
  3. 使用自訂比較函數配合 qsort,或簡單選擇排序(n≤100,O(n²) 完全足夠)。
  4. 比較準則:|a| > |b| 則 a 排前面。
  5. 輸出時數字間單一空格,行尾無多餘空格。

參考程式碼(使用 qsort)

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

int cmp(const void *a, const void *b) {
    int x = *(const int*)a;
    int y = *(const int*)b;
    int ax = abs(x), ay = abs(y);
    return (ax > ay) ? -1 : (ax < ay) ? 1 : 0; // 絕對值由大到小
}

int main() {
    int n, a[100];
    while (scanf("%d", &n) == 1 && n) {
        for (int i=0;i

手寫選擇排序版本(無需標準庫)

#include <stdio.h>
#include <math.h>

int main() {
    int n, a[100];
    while (scanf("%d", &n) == 1 && n) {
        for (int i=0;i abs(a[max_idx])) max_idx = j;
            if (max_idx != i) {
                int tmp = a[i]; a[i] = a[max_idx]; a[max_idx] = tmp;
            }
        }
        for (int i=0;i

注意事項

  • abs() 需包含 <stdlib.h> 或 <math.h>,注意 abs(INT_MIN) 未定義行為,但題目數值範圍通常安全。
  • 輸入可能跨行,scanf 自動處理空白。
  • 絕對值互不相同,故不需處理相等時的穩定性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved