c++经典排序之选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
当使用选择排序时,可以看作是有一个无序区和一个有序区(即已经排好序的区域),刚开始所有的元素都位于无序区,第一次遍历找出所有元素中最小的元素,然后交换第一个元素和最小的元素的位置,此时有序区有一个最小元素,且位于第一个位置;第二遍开始遍历就从第二个元素开始,因为第一个元素已经是最小的了,第二次遍历再从无序区中找到最小的元素,然后和第二个位置的元素交换位置,此时有序区已经有两个元素;第三次遍历就从第三个元素开始遍历。。。。依次类推,经过n-1次遍历就可以把所有的元素排好序。下面用一个简单的例子来看看具体的操作:
例如有元素:2,3,1,5,4
第一次遍历从元素2开始,寻找最小的元素,最小的元素为1,交换1和2 的位置结果如下:
1,3,2,5,4
第二次遍历从元素3开始:找到最小的元素2,交换2和3的位置,结果如下:
1,2,3,5,4
第三次遍历从元素3开始:找到最小的元素3,已经在正确的位置上,不用交换,结果如下:
1,2,3,5,4
第四次遍历从元素5开始:找到元素4,交换4和5的位置,结果如下:
1,2,3,4,5
至此,经过4趟排序,所有元素已经有序。
下面来看一下具体的代码是如何实现的。

#include <iostream>
using namespace std;
int main()
{
	int a[10] = {2,5,1,7,8,15,13,19,20,9};
	cout << "元素初始顺序如下:\n";
	for(int i = 0;i<10;i++)
	 	cout << a[i] << "    ";
	cout << endl;
	for(int i = 0;i<9;i++)
	{
		int min = i;
		for(int j = i+1;j<10;j++)
		{
			if(a[min]>a[j])
				min = j;
		}
		int temp;
		temp = a[i];
		a[i] = a[min];
		a[min] = temp;
		cout << "第" << i << "趟排序结果如下:";
		for(int k = 0;k<10;k++)
			cout << a[k] << "    ";
		cout << endl;
	}
	for(int i = 0;i<10;i++)
		cout << a[i] << "    ";
	cout << endl;
	return 0;
} 

运行代码,结果如下:
在这里插入图片描述
接下来来看一下该排序是否稳定,在分析排序是否稳定之前,先了解一下何为算法稳定?
(摘自百科)假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
接下来再来看一下一个例子:5,3,5,2,8
很显然在排序之前,第一个位置的5是在第三个位置的5之前的,
第一次遍历时:第一个位置的5会和元素2交换位置,此时排序结果是:
2,3,5,5,8
交换之后,第一个位置的5被换到了第四个位置上,即两个5的相对顺序被交换了,按照稳定性的定义,两个相同的元素在排序前后相对位置不改变才是稳定的,由此可见,选择排序不是稳定的排序。
感兴趣的朋友们可以关注我,一起学习c++吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值