選擇排序是一種簡單直觀的排序算法:
時間複雜度:O(n²) | 空間複雜度:O(1) | 不穩定排序
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100
void selection_sort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
int min_idx = i;
// 在未排序區間 [i+1, n-1] 尋找最小值索引
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[min_idx]) {
min_idx = j;
}
}
// 若最小值不在當前位置,交換
if (min_idx != i) {
int tmp = arr[i];
arr[i] = arr[min_idx];
arr[min_idx] = tmp;
}
}
}
void print_array(int arr[], int n) {
for (int i = 0; i < n; i++) printf("%d ", arr[i]);
printf("\n");
}
int main() {
int arr[] = {44, 33, 55, 999, 42};
int n = sizeof(arr) / sizeof(arr[0]);
printf("排序前: "); print_array(arr, n);
selection_sort(arr, n);
printf("排序後: "); print_array(arr, n);
return 0;
}
| 輪次 | 未排序區間 | 最小值 | 交換動作 | 數組狀態 |
|---|---|---|---|---|
| 1 | [44, 33, 55, 999, 42] | 33 | swap(44, 33) | [33, 44, 55, 999, 42] |
| 2 | [44, 55, 999, 42] | 42 | swap(44, 42) | [33, 42, 55, 999, 44] |
| 3 | [55, 999, 44] | 44 | swap(55, 44) | [33, 42, 44, 999, 55] |
| 4 | [999, 55] | 55 | swap(999, 55) | [33, 42, 44, 55, 999] |
同時選最小值放前、最大值放後,將外層循環次數減半:
void selection_sort_bidirectional(int arr[], int n) {
int left = 0, right = n - 1;
while (left < right) {
int min_idx = left, max_idx = right;
for (int i = left; i <= right; i++) {
if (arr[i] < arr[min_idx]) min_idx = i;
if (arr[i] > arr[max_idx]) max_idx = i;
}
// 處理 min/max 重疊等邊界情況...
// 交換邏輯略
left++; right--;
}
}
選擇排序最大優勢在於交換次數最少,適合「寫入代價高、讀取代價低」的存儲介質(如 EEPROM、Flash)。