什麼是選擇排序
選擇排序可以說是衆多排序算法中,最基礎、最直觀的一個算法了。
它的思想十分簡單:
- 遍歷列表,找出最小的一個數,記下索引
- 將最小的數添加到新的列表中,同時刪除原數組中的數
- 重複第一步
排序過程
舉個例子:
假如現在有一個無序數組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來取
歡迎大家友好交流[握手]