1. 程式人生 > >選擇排序1

選擇排序1

尋找 [1] 無序 log img 並且 互換 需要 cti

選擇排序(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