題目要求「給一組數組從小到大排列,也沒說幾個數」。這意味著需要編寫可處理任意長度數組的排序函數,通常接收數組指針和長度參數。
#include <stdio.h>
/**
* 冒泡排序:升序
* @param arr 數組首地址
* @param n 數組元素個數
*/
void bubble_sort(int *arr, int n) {
if (n <= 1) return; // 0 或 1 個元素無需排序
for (int i = 0; i < n - 1; ++i) {
int swapped = 0; // 優化標誌:若某輪無交換,說明已有序
for (int j = 0; j < n - 1 - i; ++j) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = 1;
}
}
if (!swapped) break; // 提前結束
}
}
// 測試主函數
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]); // 計算數組長度
printf("排序前: ");
for (int i = 0; i < n; ++i) printf("%d ", arr[i]);
bubble_sort(arr, n);
printf("\n排序後: ");
for (int i = 0; i < n; ++i) printf("%d ", arr[i]);
printf("\n");
return 0;
}
| 點 | 說明 |
|---|---|
| 參數設計 | int *arr 等價 int arr[],配合 int n 傳遞長度,實現不定長支持 |
| 長度計算 | 主調函數用 sizeof(arr)/sizeof(arr[0]) 計算,作為參數傳入 |
| 優化標誌 | swapped 讓最好情況(已有序)時間複雜度降為 O(n) |
| 邊界處理 | n <= 1 直接返回,避免循環條件溢出 |
| 算法 | 平均時間 | 最壞時間 | 空間 | 穩定性 | 適用場景 |
|---|---|---|---|---|---|
| 冒泡排序 | O(n²) | O(n²) | O(1) | 穩定 | 教學、極小數據 |
| 快速排序 | O(n log n) | O(n²) | O(log n) | 不穩定 | 通用、標準庫 qsort |
| 歸併排序 | O(n log n) | O(n log n) | O(n) | 穩定 | 外部排序、鏈表 |
| 堆排序 | O(n log n) | O(n log n) | O(1) | 不穩定 | 嵌入式、實時系統 |
qsort(<stdlib.h>),只需編寫比較函數:int cmp(const void *a, const void *b) { return *(int*)a - *(int*)b; }
qsort(arr, n, sizeof(int), cmp);
掌握「數組指針 + 長度參數」的函數接口設計,配合冒泡排序基礎實現,即可解決不定長數組排序問題。進階學習 qsort、快排分區邏輯,構建完整算法工具箱。