title: Go数据结构与算法-选择排序
tags: go,算法
介绍
选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。
基本思想
在长度为N的无序数组中,第一次遍历n-1个数,找到最小的数值与第一个元素交换;
第二次遍历n-2个数,找到最小的数值与第二个元素交换;
。。。
第n-1次遍历,找到最小的数值与第n-1个元素交换,排序完成。
算法复杂度
平均时间复杂度O(N^2)
排序过程
整个排序过程十分直观,如数组 [29, 10, 14, 37, 13]
[UNSORTED]: [29 10 14 37 13]
[DEBUG min]: 10 # 无序区间最小值为 10,此时数组为 [10 29 14 37 13]
[DEBUG min]: 13 # [10 13 14 37 29]
[DEBUG min]: 14 # [10 13 14 37 29]
[DEBUG min]: 29 # [10 13 14 29 37]
[SORTED]: [10 13 14 29 37]
使用场景
选择排序的实现未使用额外空间,直接在原地进行排序,适用于对空间复杂度要求较高的排序场景。同时它的时间复杂度并不低,和插入排序一样只适用于小数据量排序。
演示
package main
import (
"algorithms"
"fmt"
)
func main() {
arr := algorithms.GetArr(5, 20)
arr = []int{29, 10, 14, 37, 13}
fmt.Println("[UNSORTED]:\t", arr)
n := len(arr)
for i := 0; i < n-1; i++ {
// 假设无序区间第一个值为最小值
min := i
for next := min + 1; next < n; next++ {
// 找到更小值,记录其位置
if arr[min] > arr[next] {
min = next
}
}
// 将无序区间的最小值追加到有序区间
fmt.Println("[DEBUG min]:\t", arr[min])
arr[i], arr[min] = arr[min], arr[i]
}
fmt.Println("[SORTED]:\t", arr)
}