[C語言] 選擇排序之直接選擇排序的特性及實現
算法
一、算法特性測試
直接選擇是一種簡單、不穩定的選擇排序方法,屬於最爲基礎的排序方法之一。spa
其時間複雜度最好狀況爲O(n²)、最差爲O(n²)、平均爲O(n²),空間複雜度爲O(1)。code
二、算法思路:blog
以升序排列爲例,先設置一個臨時變量index_nmax存儲最大值的下標,初始通常假設爲下標0,再將選定值與其以後的數據依次比較:當比較值比選擇值大時,index_nmax更新爲比較值的下標,以後繼續檢索,直到無序序列結束爲止;當比較值小於等於插入值時,index_nmax不更新,選擇值繼續向後檢索,直到無序序列結束爲止。一輪循環事後將arr[index_nmax]與無序序列隊尾交換位置,通過len-1循環即可以將全部數據排列有序。排序
下圖與本博客算法本質上是相同的,博客中選擇最大值來排序,圖中是選擇最小值來排序:博客
三、實現代碼io
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 }
四、測試結果class