給定 n 個整數,重新排列成「倒錐形」:最大值置中,左右兩側遞減。具體規律:
a[0] ≤ a[1] ≤ ... ≤ a[n-1]mid = (n-1)/2 處放最大值 a[n-1]mid-1、mid+1、mid-2、mid+2...例如 n=5, a=[1,2,3,4,5] → 結果 [2,4,5,3,1](索引 2 為最大值 5)。
n > 0、數值範圍檢查(題目通常限定 |val| ≤ 1000)。qsort 或冒泡(n 較小時),升序。int mid = (n - 1) / 2;
output[mid] = input[n - 1]; // 最大值置中
int left = mid - 1, right = mid + 1;
for (int i = n - 2, side = 0; i >= 0; --i, side ^= 1) {
if (side == 0) output[left--] = input[i];
else output[right++] = input[i];
}
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
int main() {
int n;
if (scanf("%d", &n) != 1 || n <= 0) return 1;
int *input = malloc(n * sizeof(int));
int *output = malloc(n * sizeof(int));
if (!input || !output) { perror("malloc"); return 1; }
for (int i = 0; i < n; ++i) {
if (scanf("%d", &input[i]) != 1) { free(input); free(output); return 1; }
}
qsort(input, n, sizeof(int), cmp);
int mid = (n - 1) / 2;
output[mid] = input[n - 1];
int left = mid - 1, right = mid + 1;
for (int i = n - 2, side = 0; i >= 0; --i, side ^= 1) {
if (side == 0) output[left--] = input[i];
else output[right++] = input[i];
}
for (int i = 0; i < n; ++i) {
printf("%d%c", output[i], i == n - 1 ? '\n' : ' ');
}
free(input);
free(output);
return 0;
}
O(n log n)(排序主導),填充 O(n)。O(n)(輸入+輸出數組)。(n-1)/2 對奇偶 n 均正確(偶數時偏左)。side ^= 1 替代 if-else 翻轉,簡潔高效。left、right 不會越界,因為總共恰好填入 n-1 個元素。malloc 必須配對 free,異常路徑亦同。只需將排序改為降序,或填充時從 input[0] 開始遞增取值,邏輯完全對稱。