一。选择排序的原理:
初始时在序列中找到最小(大)元素,放到序列的起始位置作为已排序序列;然后,再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。具体见代码和注释
二。golang代码:
package main
import (
"fmt"
)
//selet sort
func main() {
var array = [6]int{6, 8, 9, 9, 2, 4}
fmt.Println("before sort:", array)
length := len(array)
for i := 0; i < length-1; i++ {
min := i //假定该轮比较中第i个元素是最小的
for j := i + 1; j < length; j++ {
//fmt.Println(min, i)
if array[j] < array[min] { //注意这里是array[min]而不是array[i],想想为什么
min = j
}
}
if min != i { //如果一轮比较完成后第i的位置不是当轮实际最小的数,就把最小的数和i的位置的数进行交换
temp := array[i]
array[i] = array[min]
array[min] = temp
}
}
fmt.Println("after sort", array)
}
白话理解就是:
第一轮假设第一个元素是最小或者最大的,然后从第二个元素开始依次和第一个元素进行比较,如果发现有比第一个元素更小或者更大的话就记录下该元素的下标,当该轮比较完成后,如果发现最小或者最大元素不是第一个,那个就把第一个元素和记录中最小或者最大元素下标对应的值进行交换,这样一来一轮结束后第一个元素一定是最小或者最大的元素
第二轮和第n轮比较依次类推就得到一个有序的数组
三。该算法的时间复杂度计算过程初略分析(假设数组元素的个数是n)
第一轮:从第二个元素开始到最后一个元素都要和当前最小的元素min进行比较,故要比较n-1
第二轮:从第三个元素开始到最后一个元素都要和当前最小的元素min进行比较,故要比较n-2
。。。
第n-1轮:最后两个元素进行比较,即比较一次
故时间复杂度:1+2+。。。+n-1 =n/2(1+n-1) 得出时间复杂度O(n^2)
若有问题或者疑问的地方,欢迎互动 共同学习成长
---------一个战斗在php一线的golang student