選擇排序的原理是每次都在剩下的資料中找出最小的資料,將該資料丟到當前的正確位置。
歡迎參考 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 前面。