选择排序,两层循环,外层循环遍历,在遍历到的元素左侧选择最大值(内层循环)与当前元素互换。相比冒泡排序,性能较优,它是选择一轮后才交换,而冒泡每次都交换。
选择排序时间复杂度为 \(O(n^2)\)。
升序排序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 选择排序,升序排序
func selectSortASC(arr []int) []int {
// 从右往左遍历
for i := len(arr) - 1; i > 0; i-- {
// 找到 i 左侧最大的值,与 i 交换
max := i
for j := 0; j < i; j++ {
if arr[max] < arr[j] {
max = j
}
}
if max != i {
arr[i], arr[max] = arr[max], arr[i]
}
}
return arr
}
将查找最大值改为查找最小值,即可实现倒序排序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 选择排序,倒序排序
func selectSortDESC(arr []int) []int {
// 从右往左遍历
for i := len(arr) - 1; i > 0; i-- {
// 找到 i 左侧最小的值,与 i 交换
min := i
for j := 0; j < i; j++ {
if arr[min] > arr[j] {
min = j
}
}
if min != i {
arr[i], arr[min] = arr[min], arr[i]
}
}
return arr
}