整數排序與比較函式溢位
Sorting Integers with a Safe Comparator・dsa-02-01
- APCS 中高級
- 排序資料上的二分搜
- 資料結構與演算法・Sorting & Searching
時間限制 1 秒・記憶體 64 MB
送出程式要先用 Discord 帳號登入 Aki-Judge,並加入註解 Annotated 的 Discord 伺服器(免費)。看題目不用登入。
題目敘述
給定 n 個整數,請由小到大(非遞減)排序後輸出。數值之間有可能相距極遠,包含 32 位元整數的最小值與最大值,因此如果你用 qsort 並讓比較函式直接回傳兩數相減的結果,減法本身可能溢位而得到錯誤的排序。比較函式只需要回傳正、零、負三種符號,請用比較運算而不是相減來決定。
輸入格式
- 第 1 行:整數 n,代表陣列長度。
- 第 2 行:n 個整數 a1, a2, ..., an。若 n = 0,第 2 行為空行。
輸出格式
輸出一行,為排序後的 n 個整數,以空格分隔。若 n = 0,輸出一個空行。
限制
- 0 ≤ n ≤ 1000
- 每個陣列元素在 [−109, 109] 範圍內
- 數值可能包含
INT_MIN與INT_MAX
範例
範例 1
輸入
5
5 3 5 1 2輸出
1 2 3 5 5有一個重複的值(5 出現兩次),兩個 5 都要印出。
範例 2
輸入
0輸出
沒有任何元素時,輸出一個空行,不是 0,也不能完全不輸出。
範例 3
輸入
1
-5輸出
-5只有一個元素時原樣輸出即可。
範例 4
輸入
9
2147483647 -2147483648 0 -2147483648 2147483647 1 -1 2147483646 -2147483647輸出
-2147483648 -2147483648 -2147483647 -1 0 1 2147483646 2147483647 2147483647兩端的極值各出現兩次。若比較函式直接用相減,INT_MAX - INT_MIN 會溢位,排序結果就會錯。
範例 5
輸入
1
42輸出
42只有一個元素 42,原樣輸出。
說明
- 比較函式可以寫成 (a > b) − (a < b),結果只會是 −1、0 或 1,不會溢位。
- 只用小數值測試時,相減的寫法看起來完全正常,所以請特別用極端值檢查自己的程式。
送出程式要先用 Discord 帳號登入 Aki-Judge,並加入註解 Annotated 的 Discord 伺服器(免費)。看題目不用登入。
卡住了可以到 Discord 的 #程式問題 發問,小墨助教會先給提示,不會直接給答案。