選擇排序 是一種簡單直觀的原地比較排序演算法。核心思想:每一輪從未排序區間找到最小 (或最大) 元素,放到已排序區間的末尾。
arr[i] 為最小值,記錄索引 min_idx = i。arr[j] < arr[min_idx],更新 min_idx = j。min_idx != i,交換 arr[i] 與 arr[min_idx]。#include <stdio.h>
#define SIZE 10
void selection_sort(int arr[], int n) {
int i, j, min_idx, temp;
for (i = 0; i < n - 1; i++) { // 輪數:只需 n-1 輪
min_idx = i; // 假設當前為最小
for (j = i + 1; j < n; j++) { // 掃描未排序區
if (arr[j] < arr[min_idx]) { // 找到更小
min_idx = j; // 更新最小值索引
}
}
if (min_idx != i) { // 需要交換
temp = arr[i];
arr[i] = arr[min_idx];
arr[min_idx] = temp;
}
}
}
void print_arr(int arr[], int n) {
for (int i = 0; i < n; i++) printf("%4d", arr[i]);
printf("\n");
}
int main() {
int arr[SIZE] = {32, 62, 12, 96, 34, 67, 12, 36, 38, 73};
printf("原始陣列: "); print_arr(arr, SIZE);
selection_sort(arr, SIZE);
printf("排序後: "); print_arr(arr, SIZE);
return 0;
}
| 指標 | 複雜度 | 說明 |
|---|---|---|
| 時間複雜度 (最好/平均/最壞) | O(n²) | 雙重迴圈,與輸入資料順序無關 |
| 空間複雜度 | O(1) | 原地排序,僅需常數額外空間 |
| 穩定性 | 不穩定 | 交換操作可能改變相等元素相對順序 |
| 交換次數 | O(n) | 每輪最多一次交換,比冒泡排序少 |
每輪同時找最小值放左端、最大值放右端,輪數減半 (但比較次數不變)。適合「交換成本極高」的場景 (如大型結構體陣列)。
生產環境大數據排序請使用 qsort (快速排序) 或 C++ std::sort (內省排序),平均 O(n log n)。