參考:《算法圖解》第2章 選擇排序
$ 選擇排序
每次從數組中找到最小值(或最大值),從舊數組中剔除,並append到新的數組
【例】你用音樂APP聽歌,對於每個歌手記錄了TA的曲目播放次數,現在要將這個列表從打到小排序,從而某種程度上將你喜歡的歌手排序
遍歷這個列表,找到作品播放次數最多的歌手,並將TA添加到一個新列表,列表2
第二輪遍歷列表(已去除排行第一的歌手)找到作品播放次數最多的歌手,並將TA添加到列表2
……不斷從列表中找出當前最大值,直到列表只剩一個元素
需要比較的次數 (n-1) + (n-2) +...+ 1 = [(n-1) + 1]*(n-1)/2
時間複雜度 O(n x n)
$ 選擇排序代碼實現
#尋找數組中的最小值
def findSamallest(arr):
smallest = arr[0] #存儲最小的值
smallest_index = 0 #存儲最小元素的索引
for i in range(1, len(arr)):
if arr[i] < smallest:
smallest = arr[i]
smallest_index = i
return smallest_index
#選擇排序算法
def selectionSort(arr):
newArr = []
for i in range(len(arr)):
smallest = findSamallest(arr)
newArr.append(arr.pop(smallest))
return newArr
print(selectionSort([5,3,6,2,10]))
arr=[5,3,6,2,10] , newArr=[]
arr=[5,3,6,10] , newArr=[2]
arr=[5,6,10] , newArr=[2,3]
arr=[6,10] , newArr=[2,3,5]
arr=[10] , newArr=[2,3,5,6]
arr=[] , newArr=[2,3,5,6,10]
$ 數組和鏈表
數組:看電影坐在一起,位置不夠挪地方 or 一開始就預留座位,位置不夠還是要挪
鏈表:看電影位置不夠分開坐,上一個人記住下一個人的位置(像尋寶遊戲),缺點:只能順序訪問
數組 | 鏈表 | |
讀取 | O(1) | O(n) |
插入 | O(n) | O(1) |
刪除 | O(n) | O(1) |