[C語言] 選擇排序之直接選擇排序的特性及實現


[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、測試結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM