C語言練習之 選擇排序(四)


摘要:選擇排序在C語言中也有着廣泛的應用,筆者在學習別人單片機代碼的過程中經常看到許多經驗豐富的老程序員

采用選擇排序,因此,筆者也記錄下來了選擇排序。

目錄

  1.選擇排序思想

  2.選擇排序示意圖

  3.算法時間復雜度和穩定性

  4.示例代碼

  5.vs2015運行示意圖

一、選擇排序思想

  選擇排序是一種直觀的排序思想,簡單來說,就是從未排序的數列中找出最小的元素,放在起始地址,接下來在從剩下未排序的數列中選擇次小的元素放在第二位置,

接下來,以此類推。

  注:筆者是按照從小到大的順序進行說明的。

二、選擇排序示意圖

  轉載自博友skywang12345:https://www.cnblogs.com/skywang12345/p/3597641.html

  下面以數列{20,40,30,10,60,50}為例,演示它的選擇排序過程(如下圖)。

  

  

排序流程

第1趟:i=0。找出a[1...5]中的最小值a[3]=10,然后將a[0]和a[3]互換。 數列變化:20,40,30,10,60,50 -- > 10,40,30,20,60,50
第2趟:i=1。找出a[2...5]中的最小值a[3]=20,然后將a[1]和a[3]互換。 數列變化:10,40,30,20,60,50 -- > 10,20,30,40,60,50
第3趟:i=2。找出a[3...5]中的最小值,由於該最小值大於a[2],該趟不做任何處理。 
第4趟:i=3。找出a[4...5]中的最小值,由於該最小值大於a[3],該趟不做任何處理。 
第5趟:i=4。交換a[4]和a[5]的數據。 數列變化:10,20,30,40,60,50 -- > 10,20,30,40,50,60

三、算法時間復雜度和穩定性

♦算法時間復雜度:數列中有N個數需要排序,而選擇排序是一個二重循環,根據算法的時間復雜度公式Ο(N)=O(m)×O(n),因此,選擇排序的時間復雜度是O(N2)。

♦算法穩定性:在待排序的數據中,存在多個相同的數據,經過排序之后,他們的相對順序依舊保持不變,實際上就是說array[i]=array[j],i<j.就是array[i]在array[j]之前,那么經過排序之后array[i]依舊在array[j]之前,那么這個排序算法穩定,否則,這個排序算法不穩定

根據上述算法穩定性的定義,選擇排序其實屬於不穩定的排序算法,反例如下:

有如下序列5 8 5 2 9, 這個在執行選擇排序的時候,第一遍,肯定會將array[0]=5,交換到2所在的位置,也就是 2 8 5 5 9,那么很顯然,之后的排序我們就會發現,array[2]中的5會出現在原先的array[0]之前,所以選擇排序不是一個穩定的排序。

筆者,找到了一些關於算法穩定性的總結如圖3-1所示:

                    3-1 算法穩定性分析

四、示例代碼

 1 #include <string>
 2 #include<iostream>
 3 
 4 #define SWAP(X,Y) X=X+Y;Y=X-Y;X=X-Y
 5 
 6 #define ARRSIZE(arr)   (sizeof(arr)/sizeof(arr[0]))
 7 
 8 using namespace std;
 9 
10 void selsort(int a[],int len); //選擇排序
11 void print(int a[], int len);
12 
13 
14 int main(int argc, char *argv) {
15 
16     int a[] = { 526,36,2,369,56,45,78,92,125,52 };
17     int length = ARRSIZE(a);
18     printf("before sort:\n");
19     print(a, length);
20     selsort(a, length);
21     printf("after sort:\n");
22     print(a, length);
23     return 0;
24     
25 
26 }
27 /*
28 **實現數據從小到大的排列
29 */
30 void selsort(int a[], int len) {
31     int min;
32     for (int i = 0; i < len - 1; i++) {
33 
34         min = i;
35         for (int j = i + 1; j < len ; j++) {
36 
37             if (a[j] < a[min]) {
38                 min = j;
39             }
40         }
41 
42         if (min != i) {
43             SWAP(a[i], a[min]);
44         }
45     }
46 
47 }
48 
49 
50 void print(int a[], int len) {
51     for (int i = 0; i < len; i++) {
52         printf("a[%d]=%d ", i, a[i]);
53     }
54     printf("\n");
55 }
View Code

 

五、vs2015運行示意圖

 

 


免責聲明!

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



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