选择排序的工作原理
第一次从待排序的数据中 选出 最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择是不稳定的排序方法选择排序
因为每次都是从数据中选出最小或者最大的数,所以叫做选择排序。
下面👇我画了一张图,来描述选择排序的基本过程。
- 首先,准备一个乱序的整型数组,
[6,3,5,7,1,9,2,8,4],我们对其进行从小到大的排序; - 先进行第一次循环,找到第一个位置最小的数应该是多少;
- 设第一个数
arr[0]为最小值minValue,然后依次让minValue和arr[1]到arr[8]之间的数进行比较,如果找到比minValue更小的数,就更新minValue和minIndex,当比较到最后一个数时,就找到了本轮循环的最小数; - 交换
arr[0]和arr[minIndex],此时,最小数minValue就跑到了第一个位置; - 后面的循环也按照上面的步骤进行,直到最后一个循环;
- 最终,得到一个从小到大顺序排列的数组,
[1,2,3,4,5,6,7,8,9]。
代码实现(golang)
package main
import "fmt"
// SelectSort 选择排序,
func SelectSort(in []int) {
inLen := len(in)
for i := 0; i < inLen; i++ {
minIndex := i
for j := i + 1; j < inLen; j++ {
if in[j] < in[minIndex] {
minIndex = j
}
}
swap(in, i, minIndex)
}
}
// 交换数据
func swap(in []int, i int, minIndex int) {
tmp := in[i]
in[i] = in[minIndex]
in[minIndex] = tmp
}
func main() {
arr := []int{6, 3, 5, 7, 1, 9, 2, 8, 4}
SelectSort(arr)
fmt.Println(arr)
}
以上就是最简单的选择排序的代码实现,其中还可以稍做优化,比方说上图中,比较到最后一个循环,也就是最后两个数时,如果arr[7]<arr[8],其实就可以不用再进入循环了,再交换一次了,直接可以反回了,只不过这里仅展示下选择排序的基本流程。
时间复杂度
选择排序因为进行了两次循环,也就是i指针外层循环,指定被选出来的最小值的要放置的位置,j内层循环,内层循环中选出最小值。所以它的时间复杂度是O(n²)。