[C語言] 選擇排序之直接選擇排序的特性及實現
1、算法特性
直接選擇是一種簡單、不穩定的選擇排序方法,屬於最為基礎的排序方法之一。
其時間復雜度最好情況為O(n²)、最差為O(n²)、平均為O(n²),空間復雜度為O(1)。
2、算法思路:
以升序排列為例,先設置一個臨時變量index_nmax存儲最大值的下標,初始一般假設為下標0,再將選定值與其之后的數據依次比較:當比較值比選擇值大時,index_nmax更新為比較值的下標,之后繼續檢索,直到無序序列結束為止;當比較值小於等於插入值時,index_nmax不更新,選擇值繼續向后檢索,直到無序序列結束為止。一輪循環過后將arr[index_nmax]與無序序列隊尾交換位置,經過len-1循環便可以將所有數據排列有序。
下圖與本博客算法本質上是相同的,博客中選擇最大值來排序,圖中是選擇最小值來排序:
3、實現代碼
1 #include <stdio.h> 2 3 // 選擇排序:相鄰兩個元素進行比較,把大的元素的下標記錄下來,一輪完整的比較之后,若最大值的下標不是len-i,則兩個元素交換位置 4 void select_sort(int arr[],int len) 5 { 6 for(int i=0; i<len; i++) // 總共要找len-1次最大值,每次找最大值的區間 [0,len-i] 7 { 8 int index_nmax = 0; 9 for(int j=1; j<len-i; j++) // 因為假設了0下標就是最大值,所以循環可以從1開始 10 { 11 if(arr[j] > arr[index_nmax]) 12 { 13 index_nmax = j; 14 } 15 } 16 if(index_nmax != len-i-1) // 避免無意義的位置交換 17 { 18 int tmp = arr[index_nmax]; 19 arr[index_nmax] = arr[len-i-1]; 20 arr[len-i-1] = tmp; 21 } 22 } 23 } 24 25 int main() 26 { 27 int arr[] = {53,82,9,233,43,14,55,9,4,67}; 28 int len = sizeof(arr)/sizeof(arr[0]); 29 30 travel(arr,len); 31 select_sort(arr,len); 32 travel(arr,len); 33 34 /* travel(arr,len); 35 cooktail_sort(arr,len); 36 travel(arr,len);*/ 37 38 return 0; 39 }
4、測試結果