基础算法----选择排序(Selection Sort)

算法稳定性,时间复杂度,空间复杂度等算法基础知识经典算法----基础知识
冒泡排序基础算法----冒泡排序
选择排序基础算法----选择排序
插入排序基础算法----插入排序
快速排序基础算法----快速排序
希尔排序基础算法----希尔排序
归并排序基础算法----归并排序
计数排序基础算法----计数排序
桶排序基础算法----桶排序
基数排序基础算法----基数排序
堆排序基础算法----堆排序

一 算法介绍

从未排序序列中找到最小/大元素,存放到已排序序列的末尾,重复此过程,直到未排序序列的元素个数为零
虽然交换次数比冒泡少,但和冒泡排序一样效率低

二 时间复杂度,空间复杂度

一) 时间复杂度

循环次数
最好情况(与期望顺序相同)/最坏情况(与期望顺序相反)的循环次数都一样:
T(n) = (n-1) + (n-2) + (n-3) + … + 1
  = n(n-1)/2


位置交换次数
最好情况:交换0次
最坏情况:交换n-1次


平均时间复杂度为T(n) = O(n2)

二) 空间复杂度

选择排序不需要额外的空间,空间复杂度为 S(n) = O(1)

三 算法稳定性

如果一个元素比当前元素小,而该元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了,选择排序是一种不稳定的排序算法

如序列 [4, 5, 4, 2, 8, 9],在一趟选择中,第1个元素4和2交换,那么原序列中两个4的相对前后顺序就被破坏了

四 实现

一) 步骤

1) 选择当前位置作为最小值
2) 和当前位置后面的依次比较,获取最小值的位置
3) 当前位置和最小值的位置交换
4) 重复步骤1), 2), 3),直到当前位置是序列的最后一个元素

二) 过程图

使用 {40, 30, 50, 40, 20, 60, 10, 70} 演示从小到大的排序过程


初始状态
选择排序----初始状态

1) 外层第一次循环
选择排序----外层第一次循环

2) 外层第二次循环
选择排序----外层第二次循环

3) 外层第三次循环
选择排序----外层第三次循环

4) 外层第四次循环
选择排序----外层第四次循环

5) 外层第五次循环 选择排序----外层第五次循环

6) 外层第六次循环 选择排序----外层第六次循环

7) 外层第七次循环选择排序----外层第七次循环

8) 外层第八次循环选择排序----外层第八次循环

三) 代码实现

func SelectSort(arr []int) {

	if len(arr) <= 1 {
		return
	}

	for i := 0; i < len(arr)-1; i++ {
		//最小值元素的索引,每个位置(i),只需和它后面的元素[i+1, len(arr)]比较
		minIndex := i
		for j := i+1; j < len(arr); j++ {
			if arr[j] < arr[minIndex] {
				minIndex = j
			}
		}

		if i != minIndex {
			arr[i], arr[minIndex] = arr[minIndex], arr[i]
		}
	}

	return
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值