Skip to content

Latest commit

 

History

History
69 lines (54 loc) · 1.72 KB

selectSort.md

File metadata and controls

69 lines (54 loc) · 1.72 KB

选择排序就是重复“从待排序的数据中寻找最小值,将其与序列最左边的数字进行交换”这一操作的算法。在序列中寻找最小值时使用的是线性查找。

代码实现:

package main

import (
	"fmt"
	"strings"
)

func selectSort(arr []int) []int {
	length := len(arr)
	if length <= 1 {
		return arr
	} else {
		for i := 0; i < length-1; i++ {
			// 记录最小值的索引
			min := i
			// 从选择值 后面值开始比较
			for j := i + 1; j < length; j++ {
				if arr[min] > arr[j] {
					min = j
				}
			}
			// 如果选中值不是最小值就交换索引
			if i != min {
				arr[i], arr[min] = arr[min], arr[i]
			}
		}
		return arr
	}
}

func main() {
	arr := []int{1, 2, 4, 7, 9, 0, 2, 3, 1, 4}
	fmt.Println(selectSort(arr))
}

算法关键点在于交换索引,先记录最小值索引往后进行比较,如果有更小的就交换。

for i := 0; i < length-1; i++ {
			// 记录最小值的索引
			min := i
			// 从选择值后面值开始比较
			for j := i + 1; j < length; j++ {
				if arr[min] > arr[j] {
					min = j
				}
			}
			// 如果选中值不是最小值就交换索引
			if i != min {
				arr[i], arr[min] = arr[min], arr[i]
			}
		}

tips:

选择排序使用了线性查找来寻找最小值,因此在第1轮中需要比较n-1个数字,第2轮需要比较n-2个数字……到第n-1轮的时候就只需比较1个数字了。因此,总的比较次数与冒泡排序的相同,都是(n-1)+(n-2)+…+1≈n2/2次。每轮中交换数字的次数最多为1次。如果输入数据就是按从小到大的顺序排列的,便不需要进行任何交换。选择排序的时间复杂度也和冒泡排序的一样,都为O(n2)。