先看选择排序定义。
- 初始状态:无序区为R[1..n],有序区为空;
- 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
- n-1趟结束,数组有序化了。
可以不拘小节,不作优化的情况下写出代码。
func selectionSort(arr []int) {
for i := 0; i < len(arr); i++ {
for j := i; j < len(arr); j++ {
if arr[i] > arr[j] {
arr[i], arr[j] = arr[j], arr[i] // 每一轮交换确保 i 位 都是最小的
}
}
}
}
交换的次数其实可以优化,为了简单,还原算法最开始的意义。
测试代码
func TestSort(t *testing.T) {
arr := rand.Perm(20)
t.Log(arr)
selectionSort(arr)
t.Log(arr)
}
测试结果
/Users/jake/go_learning/src/test/sort_test.go:20: [12 4 2 13 10 0 19 11 7 5 15 18 9 14 6 8 1 16 17 3]
/Users/jake/go_learning/src/test/sort_test.go:22: [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
有疑问加站长微信联系(非本文作者)