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

[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

相關文章
相關標籤/搜索