給定長度 n (1 ≤ n ≤ 200) 的整數數列,將其按從小到大順序排序輸出。每個整數絕對值 < 10000。
輸入:
5
8 3 6 4 9
輸出:
3 4 6 8 9
資料範圍極小 (n ≤ 200),時間複雜度 O(n²) 的簡單排序 (冒泡、選擇、插入) 完全足夠,無需快排/歸併。標準庫 `qsort` 最省事。
#include
#include
int cmp(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
int main() {
int n;
if (scanf("%d", &n) != 1) return 0;
int a[200];
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
qsort(a, n, sizeof(int), cmp);
for (int i = 0; i < n; i++) {
printf("%d%c", a[i], i == n-1 ? '\n' : ' ');
}
return 0;
}
void bubble_sort(int a[], int n) {
for (int i = 0; i < n - 1; i++) {
bool swapped = false;
for (int j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j+1]) {
int t = a[j]; a[j] = a[j+1]; a[j+1] = t;
swapped = true;
}
}
if (!swapped) break; // 已有序提前結束
}
}
題目說明絕對值 < 10000,範圍 [-9999, 9999],共 19999 個可能值,適合計數排序。
void counting_sort(int a[], int n) {
const int OFFSET = 10000; // 將負數映射到非負索引
const int RANGE = 20001;
static int count[RANGE] = {0}; // static 避免棧溢出
for (int i = 0; i < n; i++) count[a[i] + OFFSET]++;
int idx = 0;
for (int v = 0; v < RANGE; v++) {
while (count[v]-- > 0) a[idx++] = v - OFFSET;
}
}
| 演算法 | 時間 | 空間 | 穩定性 | 備註 |
|---|---|---|---|---|
| qsort | O(n log n) 平均 | O(log n) 棧 | 不穩定 | 標準庫、生產首選 |
| 冒泡/插入 | O(n²) | O(1) | 穩定 | n≤200 完全可接受 |
| 計數排序 | O(n + k) | O(k) | 穩定 | k=20001 此題最快 |
#include
#include
int cmp(const void *a, const void *b) {
int x = *(const int*)a;
int y = *(const int*)b;
return (x > y) - (x < y); // 避免溢位
}
int main() {
int n;
if (scanf("%d", &n) != 1 || n <= 0 || n > 200) return 0;
int a[200];
for (int i = 0; i < n; i++) {
if (scanf("%d", &a[i]) != 1) return 0;
}
qsort(a, n, sizeof(int), cmp);
for (int i = 0; i < n; i++) {
printf("%d%c", a[i], i == n-1 ? '\n' : ' ');
}
return 0;
}
藍橋杯基礎訓練題旨在考察基本輸入輸出、陣列操作、排序邏輯。實際比賽中 **直接用 `qsort` 最穩妥**,手寫排序僅為面試/教學展示演算法理解。計數排序在數值範圍已知且較小時是降維打擊神器,值得掌握。