選擇排序是下一章將介紹的快速排序的基石。python
計算機就像是不少抽屜的集合體,每一個抽屜都有地址。
fe0ffeeb是一個內存單元的地址。算法
【細摳起來,這個圖形有問題:實際上,計算機的內存是一維的,而圖形是二維的。】編程
須要將數據存儲到內存時,你請求計算機提供存儲空間,計算機給你一個存儲地址。須要存儲多項數據時,有兩種基本方式——數組和鏈表。但它們並不是都適用於全部的情形,所以知道它們的差異很重要。數組
數組中全部元素佔用連續的內存,因此經過數組首元素地址,能夠計算每一個元素的地址。元素的位置稱爲索引,數組的索引從0開始,幾乎全部的編程語言都從0開始對數組元素進行編號。在同一個數組中,全部元素的類型都必須相同(都爲int、double等)。數據結構
數組具備如下特色:app
鏈表的每一個元素都存儲了下一個元素的地址,從而使一系列隨機的內存地址串在一塊兒。鏈表中的元素可存儲在內存的任何地方。只要有足夠的內存空間,就能爲鏈表分配內存。編程語言
鏈表具備如下特色:spa
數組和鏈表還被用來實現其餘數據結構,好比散列表等。code
算法思想:遍歷待排序列表,找出最大或最小的元素,並添加到到新列表的第一個位置;而後找第二大或第二小的元素,依次類推,直到待排序列表裏沒有元素爲止,此時新列表的元素已按降序或升序排列。blog
選擇排序是一種靈巧的算法,但其速度不是很快。須要的總時間爲 O(n × n),即O(n2)。
Python版本:
def findSmallest(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 = findSmallest(arr) newArr.append(arr.pop(smallest)) return newArr
Haskell版本:
import Data.List (delete) selectionSort :: Ord a => [a] -> [a] selectionSort [] = [] selectionSort arr = let smallest = minimum arr in smallest : selectionSort (delete smallest arr)
請關注個人公衆號哦