經典算法---選擇排序 selection sort

選擇排序 selection sort

時間複雜度O(n2)O(n^2)

選擇排序每一趟找出一個最小(或最大)數放到序列起始位置,然後再從剩餘待排序元素中繼續找到最小(或最大)數,放到已排序的序列的尾部,以此類推,直到全部待排序元素排完。

選擇排序的思想和冒泡排序是類似的,但選擇排序和冒泡排序是有區別的1

  1. 冒泡排序比較的是相鄰兩個數,而選擇排序是順序比較,找到最小(或最大)數。
  2. 冒泡排序每一輪的比較過程中,位置不對都要換,選擇排序每輪比較只是找出最小(或最大)數的索引, 一輪查完後只換一次位置即可。
  3. 冒泡排序是穩定的(算法是否穩定見後面補充內容),因爲當比較相鄰兩者時如果是一樣的,那麼不會調換位置,但是選擇排序是不穩定的(同見補充內容)。

選擇排序和冒泡排序的優劣:

  1. 選擇排序由於一次只交換一次,所以比冒泡排序效率高些,但兩者的總體時間複雜度都是O(n2)O(n^2),所以實際上我估計也快不到哪裏去。
  2. 選擇排序需要額外使用一個臨時空間。
  3. 選擇排序是不穩定的,但是冒泡排序是穩定的。

選擇排序的C語言實現

void swap_arr(int arr[], int i, int j)
{
    int temp;
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

void selction_sort(int arr[], int len)
{
    int i, j;
    int smallest_index;
    for(i = 0; i < len; i++)
    {
        smallest_index = i;
        for(j = i+1; j < len; j++)
        {
            if(arr[j] < arr[smallest_index])
            {
                smallest_index = j;
            }
        }
        swap_arr(arr, smallest_index, i);
    }
}

補充內容

算法是否穩定的判斷標準:待排序的序列中有兩個相等元素,排序後它們的順序不變,爲算法是穩定的,否則爲算法不穩定。比如原序列中有兩個相同的值:Ai=AjA_i=A_ji,ji,j爲索引下標,且i&lt;ji&lt;j,那麼排序後還是i&lt;ji&lt;j

下面來看選擇排序爲什麼是不穩定的。假如有一個序列:3,2,3,1,43,2,3,1,4。該序列有兩個3,第一趟排序,會交換第1個3和1的位置,這樣排序後兩個3的順序就和原來就不一樣了,所以選擇排序是不穩定排序。

既然算法有穩定和不穩定之分,那麼穩定的算法有什麼好處呢?如果排序算法是穩定的,那麼從一個鍵上排序,然後再從另一個鍵上排序,第一個鍵排序的結果可以爲第二個鍵排序所用,這樣可減少開銷,說基數排序就是這樣的2,但是基數排序目前還沒去研究,等哪天研究到了,再結合算法的穩定性做總結。

參考


  1. 排序算法:冒泡排序和選擇排序的內容,區別與優缺點。 ↩︎

  2. 排序算法的穩定與不穩定 ↩︎

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