Go数据结构与算法-选择排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yang731227/article/details/85060905

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)
}

猜你喜欢

转载自blog.csdn.net/yang731227/article/details/85060905