排序算法系列——選擇排序

什麼是選擇排序

選擇排序可以說是衆多排序算法中,最基礎、最直觀的一個算法了。

它的思想十分簡單:

  1. 遍歷列表,找出最小的一個數,記下索引
  2. 將最小的數添加到新的列表中,同時刪除原數組中的數
  3. 重複第一步

排序過程

舉個例子:

假如現在有一個無序數組disorder_arr = [4,2,19,10,-1],和一個空數組order_arr = []

第一步:

​ 遍歷數組

​ 找到disorder_arr中最小值-1,並記下它的索引4

第二步:

​ 將-1添加到order_arr

​ 得到 order_arr = [-1]

第三步:

​ 刪除掉disorder_arr中的-1

​ 得到 disorder_arr = [4,2,19,10]

結束第一次循環

**重複上面的步驟 **

​ 直到遍歷len(disorder_arr)

​ 於是便可得到一個有序數組order_arr=[-1,2,4,10,19]

寫一段代碼

Python來實現這個排序數組

# selectionSort.py

class Solution:
    def selection(self, disorder_arr: list):
      
        result_arr = []
        for i in range(len(disorder_arr)):
            min_index = 0

            for index, item in enumerate(disorder_arr):
                if item < disorder_arr[min_index]: # 找到最小數
                    min_index = index
            result_arr.append(disorder_arr[min_index]) # 將最小數添加進新的列表
            disorder_arr.pop(min_index) # 將原數組中的最小數刪除,避免影響後續的判斷
        return result_arr

disorder_arr待排序的數組
result_arr是一個空數組,將每次遍歷找到的最小數添加進來
min_index最小數的索引

它的性能如何?

一般的來說,衡量的一個算法的性能我們通常使用大O表示法

由於這裏使用了雙重for循環,

因此它的時間複雜度O(n^2)

那麼它是一個穩定的算法嗎?

關於選擇排序是否穩定這一點,不同的書裏有不同的看法。

我覺得這點得根據具體的實現來看,

本文所給出的將最小的數插入到一個新的數組這種實現方式符合穩定算法的定義。

其他的實現方法,例如將當前值與最小值互換的這種實現方法則是不穩定的。

將當前值與最小值互換這種實現方法與本文的實現方法類似,就不單獨列出了。

感興趣的同學可以上我的github來取

歡迎大家友好交流[握手]

發佈了15 篇原創文章 · 獲贊 4 · 訪問量 9001
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章