一 点睛
选择式排序属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,经过和其他元素重整,再依原则交换位置后达到排序的目的。
二 选择排序思想
选择排序(select sorting)是一种简单的排序方法。它的基本思想是:第一次从 R[0]~R[n-1]中选取最小值,与 R[0]交换,第二次从 R[1]~R[n-1]中选取最小值,与 R[1]交换,第三次从 R[2]~R[n-1]中选取最小值,与 R[2]交换,…,第 i 次从 R[i-1]~R[n-1]中选取最小值,与 R[i-1]交换,…, 第 n-1 次从R[n-2]~R[n-1]中选取最小值,与 R[n-2]交换,总共通过 n-1 次,得到一个按排序码从小到大排列的有序序列。
三 图解
四 代码
package main
import (
"fmt"
)
// 完成选择排序,从大到小
func SelectSort(arr *[6]int) {
// 1 先完成将第一个最大值和 arr[0] 进行交换,先易后难
// 2 假设 arr[0] 最大值
for j := 0; j < len(arr)-1; j++ {
max := arr[j]
maxIndex := j
// 3 从 j+1 开始遍历,到 [len(arr) -1] 结束,和 max 进行比较
for i := j + 1; i < len(arr); i++ {
if max < arr[i] { // 找到真正的最大值
max = arr[i]
maxIndex = i
}
}
// 交换
if maxIndex != j {
arr[j], arr[maxIndex] = arr[maxIndex], arr[j]
}
//fmt.Printf("第%d次 %v\n ", j+1 ,*arr)
}
/*
max = arr[1]
maxIndex = 1
// 遍历 2 到 [len(arr) -1]
for i := 1 + 1; i < len(arr); i++ {
if max < arr[i] { // 找到真正的最大值
max = arr[i]
maxIndex = i
}
}
// 交换
if maxIndex != 1 {
arr[1], arr[maxIndex] = arr[maxIndex], arr[1]
}
fmt.Println("第2次 ", *arr)
max = arr[2]
maxIndex = 2
// 2 遍历 3 到 [len(arr) -1]
for i := 2 + 1; i < len(arr); i++ {
if max < arr[i] { // 找到真正的最大值
max = arr[i]
maxIndex = i
}
}
// 交换
if maxIndex != 2 {
arr[2], arr[maxIndex] = arr[maxIndex], arr[2]
}
fmt.Println("第3次 ", *arr)
max = arr[3]
maxIndex = 3
// 遍历 4 到 [len(arr) -1]
for i := 3 + 1; i < len(arr); i++ {
if max < arr[i] { // 找到真正的最大值
max = arr[i]
maxIndex = i
}
}
// 交换
if maxIndex != 3 {
arr[3], arr[maxIndex] = arr[maxIndex], arr[3]
}
fmt.Println("第4次 ", *arr)*/
}
func main() {
// 定义一个数组 , 要求从大到小
arr := [6]int{10, 34, 19, 100, 80, 789}
SelectSort(&arr)
fmt.Println(arr)
}
五 测试
[789 100 80 34 19 10]