原標題「冒泡排序改良」,實際程式碼實作為選擇排序:每輪掃描未排序區間最小值,與首位交換。
#include <stdio.h>
#include <stdlib.h>
#define LEN 10
int main(void) {
int array[LEN];
int i, j, min, tmp;
printf("請輸入 %d 個整數:", LEN);
for (i = 0; i < LEN; ++i) scanf("%d", &array[i]);
printf("原始資料:");
for (i = 0; i < LEN; ++i) printf("%d ", array[i]);
putchar('\n');
// 選擇排序
for (i = 0; i < LEN - 1; ++i) {
min = i;
for (j = i + 1; j < LEN; ++j)
if (array[min] > array[j]) min = j;
if (min != i) {
tmp = array[min];
array[min] = array[i];
array[i] = tmp;
}
}
printf("排序結果:");
for (i = 0; i < LEN; ++i) printf("%d ", array[i]);
putchar('\n');
return 0;
}
| 指標 | 選擇排序 | 冒泡排序(優化版) | 快速排序 |
|---|---|---|---|
| 時間複雜度 | O(n²) | O(n²) | O(n log n) 平均 |
| 空間複雜度 | O(1) | O(1) | O(log n) 堆疊 |
| 穩定性 | 不穩定 | 穩定 | 不穩定 |
| 交換次數 | O(n) | O(n²) | O(n log n) |
qsort / std::sort (Introsort)