1. 程式人生 > >選擇排序(Selection sort)

選擇排序(Selection sort)

選擇排序算是對氣泡排序的一種改進:假設有n個待排列的資料,在第一輪遍歷中,仍進行n - 1次比較,遍歷的時候用當前數與當前獲得的最大數進行比較,而不是相鄰的資料進行比較,且僅進行一次資料交換。而氣泡排序在每一次比較的過程中,發現數據順序不一致就交換,資料交換的次數更多。選擇排序只需要用標記記住每一輪的最大數,然後與排序模式中該最大數應該待的位置進行一次資料交換。
廢話不多說,直接看Python的實現程式碼:

def selection_sort(a_list):
    for current_pass in range(len(a_list) - 1, 0, -1):
        max_index = 0
        for location in range(1, current_pass + 1):
            if a_list[location] > a_list[max_index]:
                max_index = location
        temp = a_list[max_index]
        a_list[max_index] = a_list[current_pass]
        a_list[current_pass] = temp


我們在每一輪中用max_index記錄當前比較的最大值的索引位置,然後用下一個資料與當前所標記的最大值進行比較,若比當前最大值還大,則更新最大值的索引。一輪遍歷完成後,進行資料交換,將當前輪次確定的最大值與指定位置的值進行一次資料交換。
值得注意的是,選擇排序不是一個穩定的排序演算法。比如有 2 9 5 9 3這幾個數,進行從小到大排序,第一輪遍歷時,確定了第一個9是最大的數,然後和3進行交換,交換後的順序為2 3 5 9 9。顯然排序前和排序後的2個9的相對位置發生了交換,演算法穩定性遭到破壞。
有人可能會問,如果將if語句的>改為>=,那麼第一輪遍歷的時候第二個9就會與3進行交換,從而保證了第二個9在整體排序後依然排在第一個9的右邊,從而保證了演算法的穩定性。但不幸的是朋友,你錯了。我們依然按照上面的例子,只是這次變成2 1 9 3 3,按照>=就交換最大值的原則,那麼第一輪遍歷時,9和最右邊的3交換,從而破壞了2個3之間的相對順序。而第二輪由於使用了>=,則2個3的相對順序又沒有改變回來。所以,不管是>還是>=就交換最大值,穩定性都有機率遭到破壞,故選擇排序是一種不穩定的排序演算法。