排序算法(1)——選擇排序

[轉載] 百度百科

1、擬解決問題

輸入

n個數的序列<a1,a2,a3,...,an>。

輸出

原序列的一個重排<a1*,a2*,a3*,...,an*>;,使得a1*<=a2*<=a3*<=...<=an*

2、選擇排序的思想

1)、假定第一個元素是最小值,依次 和其它每個元素比較,最終找到最小數,用變量k記住它在數組中的位置(下標);
2)、然後進行判斷,如果這個元素的下標不是第一個元素的下標,就讓第一個元素跟他交換一下值,這樣就放置好整個數組中最小的數了。
3)、假定第二個元素是最小值,然後找到數組中第二小的數,判斷交換,就放置好整個數組中數組中第二小的數了。以此類推。

3、選擇排序的實現

/* 選擇排序 */
void select_sort(int*a,int n)
{
    int i,j,min,t;
    for(i=0;i<n-1;i++)
    {
        min=i;//查找最小值
        for(j=i+1;j<n;j++)
            if(a[min]>a[j])
                min=j;
        if(min!=i)//判斷當前元素是否是就最小值
        {
            t=a[min];
            a[min]=a[i];
            a[i]=t;
        }
    }
}

4、選擇排序的性能

1、時間複雜度

交換操作次數介於 0 ~ (n - 1) 。最好情況是,已經有序,交換0次;最壞情況交換n-1次;逆序要交換n/2次。

賦值操作次數是交換操作次數的3倍,介於 0 ~ 3 (n - 1) 之間。

比較操作次數次數與關鍵字的初始狀態無關,都是N=(n-1)+(n-2)+…+1=n*(n-1)/2,即滿足 O(n^2)。

2、穩定性

如果一個元素比當前元素小,而該小的元素又出現在一個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。
比較拗口,舉個例子,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中兩個5的相對前後順序就被破壞了,所以選擇排序是一個不穩定的排序算法。

和其它排序算法比較:
1)、選擇排序比冒泡排序的交換次數少多了,由於交換所需的CPU時間 比 比較所需的CPU時間多,所以選擇排序比冒泡排序快(n值較小時?還是無論n大小都是?)。
2)、堆排序類似於選擇排序。它是利用了最大堆的性質——父親要大於等於孩子的值,所以根節點是最大值,每次就選擇根節點元素放到正確的位置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章