接之前的文章 iOS程序員也要學(xué)點(diǎn)算法吧-簡單排序之冒泡排序 , 我們發(fā)現(xiàn)冒泡排序的比較效率和交換效率都是O(N2) ,這一半不是我們想要的姥芥,這里引入了選擇排序,選擇排序講算法的交換效率減少到了O(N),對(duì)于部分編程語言來說汇鞭,往往交換耗時(shí)更大凉唐,所以在學(xué)習(xí)過程中未嘗不是一個(gè)解決的辦法。
選擇排序的思想還是霍骄,利用雙層循環(huán)台囱,只不過每次循環(huán)中,我們用一個(gè)MinIndex變量 記錄最小值的下標(biāo)读整,在每次內(nèi)存循環(huán)結(jié)束后簿训,才發(fā)生交換,大大的減少了交換次數(shù)绘沉, 先來個(gè)演示吧
在大數(shù)據(jù)量的時(shí)候交換次數(shù)顯得尤為明顯
代碼如圖
//:MARK - 2 選擇排序
func selectSort<T:Comparable>( aArr:[T]) -> [T] {
var arr = aArr
var minIndex = 0 // 記錄每次遍歷的最小值
for outerIndex in 0..<arr.count {
minIndex = outerIndex
for innerIndex in (outerIndex + 1)..<arr.count {
if arr[minIndex] > arr[innerIndex] {
minIndex = innerIndex // 判斷最小值煎楣,充值選擇的標(biāo)記
}
// 在每次外層遍歷之后再交換
if minIndex != outerIndex {
let t = arr[outerIndex]
arr[outerIndex] = arr[minIndex]
arr[minIndex] = t
}
}
}
return arr
}
print(selectSort([9,8,7,6,5,4,3,2,1,0]))