go 选择排序
选择排序
每次检索找到最小(大)的值放在最前面,再从剩余的未排序元素放到依次放到前面
空间复杂度 :f(1 + 1) = O(1)
时间复杂度 :f((n-1)+(n-2)+……+1 = f(n(n-1)/2) = O(n²)
过程:
1、记住第一点的位置 , 把第一点位置与数组每个元素比较,只要大于第一点的位置,则记住新位置与后面的值比较,比较完毕,则找到了这个数组中最大的值,把该值与第一位交换
2、再从第二位开始重复第一点的比较
3、最终 前面部分会先排好,后面的慢慢排下去
4、第一遍比较,执行次数为(n-1) , 第二遍因为第一位已经排好则少了一次(n-1-1) ,第三遍因为前两位已排好,则(n-1-1-1)
/**
* @author Yel
* 选择排序
* 每次检索找到最小(大)的值放在最前面,再从剩余的未排序元素放到依次放到前面
* 空间复杂度 :f(1 + 1) = O(1)
* 时间复杂度 :f((n-1)+(n-2)+……+1 = f(n(n-1)/2) = O(n²)
* 过程:
* 1\记住第一点的位置 , 把第一点位置与数组每个元素比较,只要大于第一点的位置,则记住新位置与后面的值比较,比较完毕,则找到了这个数组中最大的值,把该值与第一位交换
* 2\再从第二位开始重复第一点的比较
* 3\最终 前面部分会先排好,后面的慢慢排下去
* 4\第一遍比较,执行次数为(n-1) , 第二遍因为第一位已经排好则少了一次(n-1-1) ,第三遍因为前两位已排好,则(n-1-1-1)
*/
func Selectionsort(arr []int, order string) {
var length = len(arr) // 长度
if length < 2 {
return
}
var index int = 0 // 索引
// 每个元素 都和 后面的元素对比
for i := 0; i < length-1; i++ {
index = i // 最小最大值
// 找到最小(大)的,然后保留索引
for j := i + 1; j < length; j++ {
// 升序
if order == "asc" {
// 当前位置比索引大,则记录索引,和后面的比较
if arr[index] > arr[j] {
index = j
}
} else {
// 降序
if arr[index] < arr[j] {
index = j
}
}
}
if index == i {
continue
}
// 交换位置
arr[index], arr[i] = arr[i], arr[index]
}
return
}