【數據結構與算法Python實踐系列】經典排序算法-選擇排序

選擇排序

  • 選擇排序(Selection sort)是一種簡單直觀的排序算法。
  • 第一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,然後再從剩餘的未排序元素中尋找到最小(大)元素,然後放到已排序的序列的末尾。以此類推,直到全部待排序的數據元素的個數爲零。選擇排序是不穩定的排序方法。

算法的原理如下:

  • 我們認爲列表的第一個元素是最小元素,從後面元素依次與首元素比較
  • 當存在元素比目標元素小時,最小值更新,直到訪問至列表最後的元素
  • 將最小值與目標值進行位置交換
  • 目標位置向後移動一位並將其認定爲最小元素,重複以上步驟依次進行比較
  • 會將所有小的元素選擇出來,排序完畢
    在這裏插入圖片描述

時間複雜度

  • 選擇排序的交換操作介於 0 和 (n - 1) 次之間。
  • 選擇排序的比較操作爲 n (n - 1) / 2 次之間。
  • 選擇排序的賦值操作介於 0 和 3 (n - 1) 次之間。
  • 比較次數 O(n2O(n^2),比較次數與關鍵字的初始狀態無關,總的比較次數N=(n-1)+(n-2)+…+1=n*(n-1)/2。
  • 交換次數O(nO(n),最好情況是,已經有序,交換0次;
  • 最壞情況交換n-1次,逆序交換n/2次。
  • 交換次數比冒泡排序少多了,由於交換所需CPU時間比比較所需的CPU時間多,n值較小時,選擇排序比冒泡排序快。

穩定性分析

選擇排序是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩餘元素裏面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因爲只剩下它一個最大的元素了。那麼,在一趟選擇,如果一個元素比當前元素小,而該小的元素又出現在一個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。比較拗口,舉個例子,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中兩個5的相對前後順序就被破壞了,所以選擇排序是一個不穩定的排序算法。

python實現

def select_sort(arr):
    for i in range(len(arr) - 1):
        min = i
        for j in range(i, len(arr) - 1):
            if arr[min] > arr[j]:
                min = j
        arr[i], arr[min] = arr[min], arr[i]
    return arr
    
if __name__ == "__main__":
    print(select_sort([45, 32, 8, 33, 12, 22, 19, 97]))
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章