【算法】选择排序

算法-选择排序


前置知识
  • C++入门

思路

我们现在有一个序列,怎么对它排序?
这是一个非常经典的问题,这里我们使用一个经典的基础算法——选择排序解决。

这里有一个序列,要对它升序排序
6 1 8 4 9 7 2 5 3 \begin{array}{cc} 6&1&8&4&9&7&2&5&3 \end{array} 618497253
我们把序列分为无序序列有序序列
这里,我们将无序序列用红色表示,有序序列用蓝色表示
很显然,这里的所以元素默认都是无序的,换句话说,所有元素都属于无序序列
6 1 8 4 9 7 2 5 3 \begin{array}{cc} \red6&\red1&\red8&\red4&\red9&\red7&\red2&\red5&\red3 \end{array} 618497253
此时从无序序列中选取最小的值,将其与无序序列第一个数交换,并入有序序列
min ⁡ = 1 1 6 8 4 9 7 2 5 3 \min=1\\\begin{array}{cc} \blue1&\red6&\red8&\red4&\red9&\red7&\red2&\red5&\red3 \end{array} min=1168497253
重复操作,直至无序序列为空。
min ⁡ = 2 1 2 8 4 9 7 6 5 3 min ⁡ = 3 1 2 3 4 9 7 6 5 8 min ⁡ = 4 1 2 3 4 9 7 6 5 8 min ⁡ = 5 1 2 3 4 5 7 6 9 8 min ⁡ = 6 1 2 3 4 5 6 7 9 8 min ⁡ = 7 1 2 3 4 5 6 7 9 8 min ⁡ = 8 1 2 3 4 5 6 7 8 9 min ⁡ = 9 1 2 3 4 5 6 7 8 9 \min=2\\\begin{array}{cc} \blue1&\blue2&\red8&\red4&\red9&\red7&\red6&\red5&\red3 \end{array}\\\min=3\\\begin{array}{cc} \blue1&\blue2&\blue3&\red4&\red9&\red7&\red6&\red5&\red8 \end{array}\\\min=4\\\begin{array}{cc} \blue1&\blue2&\blue3&\blue4&\red9&\red7&\red6&\red5&\red8 \end{array}\\\min=5\\\begin{array}{cc} \blue1&\blue2&\blue3&\blue4&\blue5&\red7&\red6&\red9&\red8 \end{array}\\\min=6\\\begin{array}{cc} \blue1&\blue2&\blue3&\blue4&\blue5&\blue6&\red7&\red9&\red8 \end{array}\\\min=7\\\begin{array}{cc} \blue1&\blue2&\blue3&\blue4&\blue5&\blue6&\blue7&\red9&\red8 \end{array}\\\min=8\\\begin{array}{cc} \blue1&\blue2&\blue3&\blue4&\blue5&\blue6&\blue7&\blue8&\red9 \end{array}\\\min=9\\\begin{array}{cc} \blue1&\blue2&\blue3&\blue4&\blue5&\blue6&\blue7&\blue8&\blue9 \end{array} min=2128497653min=3123497658min=4123497658min=5123457698min=6123456798min=7123456798min=8123456789min=9123456789


算法参数
  • 时间复杂度: Θ ( n 2 ) \Theta(n^2) Θ(n2)
  • 空间复杂度: Θ ( n ) \Theta(n) Θ(n)
  • 稳定性:不稳定

实现代码
void SelectionSort(int a[],int n){
	for (int i=1;i<=n;i++){
		int pos=i;
		for (int j=i+1;j<=n;j++)
			if (a[pos]>a[j])
				pos=j;
		swap(a[i],a[pos]);
	}
}

练习
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值