1. 原理介紹
選擇排序是個簡單的排序,思路主要通過多次遍歷待排序的集合,每次彈出最大/小值並放入新的集合,直到原始集合爲空。舉個例子:
假設要對A=[1,2,5,9,3]按照升序的方式進行排序,步驟與結果如下
- 從A中找出最大值,將其pop,並放入B中,執行後的結果如下:
A=[2,5,9,3]
B=[1]
- 重複執行第一部
A=[5,9,3]
B=[1,2]
- 重複執行第一部
A=[5,9]
B=[1,2,3]
- 重複執行第一部
A=[9]
B=[1,2,3,5]
- 重複執行第一部
A=[]
B=[1,2,3,5,9]
- 此時A爲空,返回B
2. 運行時間分析
從上面的過程可以看出,要對A進行排序,必須要執行N輪操作,每一輪操作必須檢查列表中的每個元素。隨着排序的進行,每次需要檢查的元素數在逐漸減少,最後一次需要檢查的元素都只有一個。平均每次檢查的元素數爲1/2 × n, 因此運行時間爲O(n × 1/2 × n),但大O表示法省略諸如1/2這樣的常數,因此簡單地寫作O(n × n)或O(n^2)。
3. 代碼實現
Go語言實現的過程如下:
// 對int數組的選擇排序
func SelectSort(items []int) []int {
result := make([]int,len(items))
for i:=0;i< len(result);i++{
tmpIndex := getMinItemIndex(&items)
result[i]=items[tmpIndex]
//從原始數組中刪除掉被選擇的元素
items = append(items[:tmpIndex], items[tmpIndex+1:]...)
}
return result
}
//獲取一個數組中,最小元素的位置
func getMinItemIndex(ints *[]int) int {
//默認假設第一個元素作爲臨時最小值
min := (*ints)[0]
smallestIndex :=0
for index,item := range *ints {
if item < min {
min = item
smallestIndex =index
}
}
return smallestIndex
}
4. 總結
- 選擇排序的時間複雜度爲:O(n^2)