2. 基础排序算法——选择排序(golang)


选择排序

和冒泡排序相比,选择排序先是通过和比较,从而找到最小值的索引,最后进行交换。

重复上述过程,最后便能得到有序的数组。



代码实现

func SelectSort(arr []int) []int {

	// 数组长度
	length := len(arr)

	// 数组为空或者只有一个元素
	if length <= 1 {
		return arr
	}

	// 遍历,比较
	for i := 0; i < length-1; i++ {

		// 标记索引
		min := i

		// 找到最小值的索引
		for j := i + 1; j < length; j++ {
			if arr[min] > arr[j] {
				min = j
			}
		}

		// 当i不是最小值的索引时,进行交换
		if i != min {
			arr[i], arr[min] = arr[min], arr[i]
		}
	}
	return arr
}



时间复杂度

无论最好还是最坏的情况,时间复杂度都是O(n^2)。

尽管与冒泡排序同为O(n^2),但选择排序的性能还是要由于冒泡排序。



稳定性

选择排序是一个不稳定排序算法

选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。比较拗口,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章