选择排序
选择排序的思想是:双重循环遍历数组,每经过一轮比较,找到最小元素的下标,将其交换至首位。
package main
import "fmt"
func main() {
values1 := []int{4, 93, 84, 85, 80, 37, 81, 93, 27, 12}
fmt.Println(values1) // [4 93 84 85 80 37 81 93 27 12]
SelectSort(values1)
fmt.Println(values1) // [4 12 27 37 80 81 84 85 93 93]
values2 := []int{4, 93, 84, 85, 80, 37, 81, 93, 27, 12}
fmt.Println(values2) // [4 93 84 85 80 37 81 93 27 12]
SelectSort(values2)
fmt.Println(values2) // [4 12 27 37 80 81 84 85 93 93]
}
func SelectSort(values []int) {
for i := 0; i < len(values); i++ {
min := i
for j := len(values) - 1; j > i; j-- {
if values[j] < values[min] {
min = j
}
}
values[i], values[min] = values[min], values[i]
}
}
func SelectSort2(values []int) {
var minIndex int
var maxIndex int
// i 只需要遍历一半
for i := 0; i < len(values) / 2; i++ {
minIndex = i
maxIndex = i
for j := i + 1; j < len(values) -1; j++ {
if values[minIndex] > values[j] {
// 记录最小值的下标
minIndex = j
}
if values[maxIndex] < values[j] {
// 记录最大值的下标
maxIndex = j
}
}
// 如果 minIndex 和 maxIndex 都相等,那么他们必定都等于 i,且后面的所有数字都与 arr[i] 相等,此时已经排序完成
if minIndex == maxIndex {
break;
}
// 将最小元素交换至首位
values[minIndex], values[i] = values[i], values[minIndex]
// 如果最大值的下标刚好是 i,由于 arr[i] 和 arr[minIndex] 已经交换了,所以这里要更新 maxIndex 的值。
if maxIndex == i {
maxIndex = minIndex
}
// 将最大元素交换至末尾
lastIndex := len(values) -1 - i;
values[maxIndex], values[lastIndex] = values[lastIndex], values[maxIndex]
}
}