选择排序
和冒泡排序相比,选择排序先是通过和比较,从而找到最小值的索引,最后进行交换。
重复上述过程,最后便能得到有序的数组。
代码实现
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的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。