選擇排序1
選擇排序(Selection sort)
一種簡單直觀的排序算法。它的工作原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。 選擇排序是不穩定的排序方法(比如序列[5, 5, 3]第一次就將第一個[5]與[3]交換,導致第一個5挪動到第二個5後面)。
選擇排序(Selection sort)是一種簡單直觀的排序算法。其基本思想是:首先在未排序的數列中找到最小(or最大)元素,然後將其存放到數列的起始位置;接著,再從剩余未排序的元素中繼續尋找最小(or最大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
圖解選擇排序
以數列{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
選擇排序代碼
根據上面流程,不難寫出選擇排序的代碼實現,此處是按升序排列。
/* * 選擇排序 * * 參數說明: * a -- 待排序的數組 * n -- 數組的長度 */ void select_sort(int a[], int n) { int i; // 有序區的末尾位置 int j; // 無序區的起始位置 int min; // 無序區中最小元素位置 for(i=0; i<n; i++) { min=i; //找"a[i+1]..a[n]"之間最小元素,並賦給min for(j=i+1; j<n; j++) { if(a[j] < a[min]) min=j; } //若min!=i,則交換 a[i] 和 a[min]。 //交換後,保證了a[0]..a[i]之間元素有序。 if(min != i) swap(a[i], a[min]); } }
時間復雜度和穩定性
選擇排序的時間復雜度是O(N2):假設被排序的數列中有N個數。遍歷一趟的時間復雜度是O(N),需要遍歷多少次呢?N-1次因此,選擇排序的時間復雜度是O(N2)。
選擇排序是穩定的算法,它滿足穩定算法的定義:假設在數列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;並且排序之後,a[i]仍然在a[j]前面。則這個排序算法是穩定的!
選擇排序1