選擇排序的原理是每次都在剩下的資料中找出最小的資料,將該資料丟到當前的正確位置。
歡迎參考 edX 上開授的 CS 50 課程示範影片:
也就是說將第 i 筆到第 n 筆資料中排出最小值,與第 i 筆資料做交換。
- 從 i = 1 到 n-1 ,作 n-1 回合
- 每回合自第 i 筆到第 n 筆中排出最小值,與第 i 筆資料做交換

虛擬碼
SelectionSort(A, n) //排序A[1]到A[n]
for i = 0 to n-2 do
min = i
for j = i+1 to n-1 do
if A[j] < A[min]
min = j
swap A[i] and A[min]
程式碼
void swap(int *a, int *b){
int temp;
temp = *a;
*a = *b;
*b= temp;
}
int selection_sort(int list[], int n){
int i, j, min_id;
for(i = 0; i<n-1; i++){
min_id = i;
for(j=i+1; j<n; j++){
if (list[j] < list[min_id])
min_id = j;
}
swap(&list[i], &list[min_id]); //送地址過去swap function
}
};
int main(){
int count, i;
scanf("%d", &count);
int list[count];
printf("Numbers to be sorted: ");
for(i = 0; i<count; i++){
scanf("%d", &list[i]);
printf("%d ", list[i]);
}
printf("\n");
selection_sort(list, count);
printf("Numbers Sorted: ");
for(i = 0; i<count; i++){
printf("%d ", list[i]);
}
return 0;
}

時間複雜度
無論 Average/Worst/Best Case 皆為 O(n2)
比較次數= (n-1) + (n-2) + … +1 = n(n-1)/2 次
空間複雜度: O(1)
需要一個額外的空間儲存暫存變數 temp 用來做資料交換用。
穩定性: UNSTABLE
選擇排序屬於不穩定排序──第 i 回合會將第 i 小的資料與第 i 個位置做交換。即使資料大小相同也會被交換。
Pass 0 ------------------------- array index: [0] [1] [2] input data: 5 5* 3 Pass 1: ------------------------- array index: [0] [1] [2] input data: 3 5* 5
可以發現在第一回合過後,5* 從原本在 5 後面,跑到了 5 前面。










