一、基本介绍
- 选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到 排序的目的。
- 抽象理解
- 班里学生排队,个高的在最后个小在最前
- 首先在一个参差不齐的队列里
- 以第一个学生为准让他和后面的每一个学生进行比对
- 当发现有比自己个小的时候,自己出来让这个比自己个小的人和下一个比较(里层循环)
- 直到比完挑选出本轮最小个子的人,将他的位置和第一个学生的位置调换。
- 然后从以第二个学生为准让他和后面的每一个学生进行比对,直到比完位置(外层循环)
二、选择排序思想
- 第一次从 arr[0]~arr[n-1]中选取最小值, 与 arr[0]交换
- 第二次从 arr[1]~arr[n-1]中选取最小值,与 arr[1]交换
- 第三次从 arr[2]~arr[n-1]中选取最小值,与 arr[2] 交换
- 第 i 次从 arr[i-1]~arr[n-1]中选取最小值,与 arr[i-1]交换
- 第 n-1 次从 arr[n-2]~arr[n-1]中选取最小值, 与 arr[n-2]交换,总共通过 n-1 次,得到一个按排序码从小到大排列的有序序列。
- 选择排序思路分析图 :

三、代码实现
package main
import "fmt"
func main() {
numbers := []int{6, 2, 7, 5, 8, 9}
SelectSort(numbers)
fmt.Println(numbers)
}
func SelectSort(values []int) {
length := len(values)
if length <= 1 {
return
}
for i := 0; i < length; i++ {
min := i // 初始的最小值位置从0开始,依次向右
// 从i右侧的所有元素中找出当前最小值所在的下标
for j := length - 1; j > i; j-- {
if values[j] < values[min] {
min = j
}
}
//fmt.Printf("i:%d min:%d\n", i, min)
// 把每次找出来的最小值与之前的最小值做交换
values[i], values[min] = values[min], values[i]
//fmt.Println(values)
}
}