package main
import "fmt"
/*
选择排序
每一次在未排序的数组元素中找到一个最小的,与当前交换位置
*/
func selectsort(arr []int) []int {
temp := len(arr)
if temp <= 1 {
return nil
}
for i := 0; i < temp; i++ { // 外层循环控制每一次需要变化的位置
min := i // 将当前值的位置拿出来
for j := i + 1; j < temp; j++ { // 内层循环控制找到此次剩下值的最小值
if arr[min] > arr[j] {
min = j
}
}
if i != min { // 找到最小值之后与当前值进行比较,如果小于就交换
arr[i], arr[min] = arr[min], arr[i]
}
}
return arr
}
func main() {
// var arr = []int{6, 3, 2, 5, 9, 7, 1}
arr := []int{3, 2, 5, 1, 6, 9, 8}
fmt.Println(selectsort(arr))
}
时间复杂度
时间复杂度分析
使用了一个外循环,需要循环temp次
使用了一个内循环,需要循环temp次
则循环的次数与temp有关
而temp
是数组的长度
所以可知选择排序的时间复杂度与数组的长度有关,temp*temp
= N*N
所以选择排序的时间复杂度为O(N^2)
额外空间复杂度
首先定义了一个temp
变量,又定义了一个i,min,j
变量,加起来也没超过多少,所以额外空间复杂度为O(1)。
为什么是O(1)而不是O(N)呢?
因为这些变量是有限的,而不是随着某个数的增大而增大