選擇排序
和冒泡排序相比,選擇排序先是通過和比較,從而找到最小值的索引,最後進行交換。
重複上述過程,最後便能得到有序的數組。
代碼實現
func SelectSort(arr []int) []int {
// 數組長度
length := len(arr)
// 數組爲空或者只有一個元素
if length <= 1 {
return arr
}
// 遍歷,比較
for i := 0; i < length-1; i++ {
// 標記索引
min := i
// 找到最小值的索引
for j := i + 1; j < length; j++ {
if arr[min] > arr[j] {
min = j
}
}
// 當i不是最小值的索引時,進行交換
if i != min {
arr[i], arr[min] = arr[min], arr[i]
}
}
return arr
}
時間複雜度
無論最好還是最壞的情況,時間複雜度都是O(n^2)。
儘管與冒泡排序同爲O(n^2),但選擇排序的性能還是要由於冒泡排序。
穩定性
選擇排序是一個不穩定排序算法。
選擇排序是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩餘元素裏面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因爲只剩下它一個最大的元素了。那麼,在一趟選擇,如果一個元素比當前元素小,而該小的元素又出現在一個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。比較拗口,舉個例子,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中兩個5的相對前後順序就被破壞了,所以選擇排序是一個不穩定的排序算法。