Python3 選擇排序

參考:《算法圖解》第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)

 

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