選擇排序每輪在未排序區間找出最小元素,與區間首元素交換。與冒泡排序不同,它每輪僅交換一次,減少寫入操作。
初始:2, 1, 5, 4, 9
1, 2, 5, 4, 91, 2, 5, 4, 91, 2, 4, 5, 91, 2, 4, 5, 9void select_sort(int array[], int length) {
if (NULL == array || length <= 1) return;
for (int outer = 0; outer < length - 1; ++outer) {
int min_idx = outer;
// 在 [outer+1, length) 尋找最小值索引
for (int inner = outer + 1; inner < length; ++inner) {
if (array[inner] < array[min_idx])
min_idx = inner;
}
// 若最小值不在首位,交換
if (min_idx != outer) {
int tmp = array[outer];
array[outer] = array[min_idx];
array[min_idx] = tmp;
}
}
}
| 指標 | 複雜度 | 說明 |
|---|---|---|
| 時間 | O(n²) | 雙重循環,與輸入無關 |
| 空間 | O(1) | 原地排序 |
| 穩定性 | 不穩定 | 交換可能改變相等元素相對順序 |
| 交換次數 | O(n) | 最多 n-1 次,優於冒泡/插入 |
void print_array(int arr[], int len) {
for (int i = 0; i < len; ++i)
printf("%d ", arr[i]);
printf("\n");
}
void test() {
int data[] = {2, 1, 5, 4, 9};
int size = sizeof(data) / sizeof(int);
printf("Before: "); print_array(data, size);
select_sort(data, size);
printf("After : "); print_array(data, size);
// 輸出:1 2 4 5 9
}
選擇排序雖屬 O(n²),但交換次數極少,適合「寫入成本高」(如 Flash 記憶體)的場景。理解其「選最小、換到首」的核心邏輯,是掌握更高級排序算法的基石。