简单选择排序

1.简述

选择排序呢就是从数据集中每一次选出来一个最大/小的值,并将这个选出来的值放在开头,然后一次次循环来找出剩下的数据中的最大/小值的过程;

2.原理

说形象点哈,好比从盒子中往外拿球球,先拿出来第一个球,将这个球与剩下的所有球球进行比较,若某个球球的数比当前拿出的这个球球数字大/小,则交换球球,等和剩下的所有数字比较完成,那么当前第一个位置的这个元素就是咱们选出来的最大/小值,然后依次类推;
和冒泡的区别呢,如下:
假如有数组:a,b,c,d,e
冒泡的思想
相邻元素比较,a与b比,在b与c比,在c与d比,在d与e比,从而选出来了最大/小值;
选择的思想
先拿出来a,将a与b比,a与c比,a与d比,a与e比,选出来了最大/小值;

举例:对数组【 20, 40, 8, 96, 32, 12, 45, 3】排序:
第一轮,取第一个数20,和剩下的数字比较,结果:
3,40,20,96,32,12,45,8
第二轮:取第二个数40,和剩下的数字比较,结果:
3,8,40,96,32,20,45,12
第三轮:取第三个数32,和剩下的数字比较,结果:
3,8,12,96,40,32,45,20
第四轮:取第四个数,和剩下的数字比较,结果:
3,8,12,20,96,40,45,32
第五轮:取第五个数,和剩下的数字比较,结果:
3,8,12,20,32,96,45,40
第六轮:取第六个数,和剩下的数字比较,结果:
3,8,12,20,32,40,96,45
第七轮:取第七个数,和剩下的数字比较,结果:
3,8,12,20,32,40,45,96
第八轮:只剩96了,最大的,所以最后一个可以不用比较;

需要注意的是:
(1)因为有n个元素,只需要选n-1次就行,因为最后只剩一个了,肯定是最大/小的值;
(2)因为取出来了第一个数,所以要从这个数据之后的第一个数据开始进行比较;
稳定性:
由于在选择过程中,是将第一个选择的数与剩下的元素比较的方式,所以在有重复数据时,若先拿出来第一个重复数据,并且在第二个重复数据后有小于这个值的元素,交换后则两个重复元素的相对位置变了,是非稳定的;
冒泡呢,由于是相邻比较,若判断中不存在等于号,左边的元素在与右边的元素相等时,是永远不会换到后边这个元素之后的;
选择由于每个重复元素都要进行比较,就不能保证他们的相对位置;
(冒泡连接:https://blog.csdn.net/qq_27420299/article/details/94358859)

3.代码

void selectSort(int *array, int size)
{
	if (NULL == array)
	{
		return;
	}

	// 选择的元素个数,每一次拿出一个,需要拿n-1次就行
	for (int selectNumber = 0; selectNumber < size - 1; selectNumber++)
	{
	    // 从当前选择的元素后边的元素开始比较,一直比到末尾
		for (int lastNumer = selectNumber + 1; lastNumer < size; lastNumer++)
		{
		    // 这里是当前拿出来的元素与剩下所有元素比较
			if (*(array + selectNumber) > *(array + lastNumer))
			{
				int tmp = *(array + selectNumber);
				*(array + selectNumber) = *(array + lastNumer);
				*(array + lastNumer) = tmp;
			}
		}
	}
}

4.总结

(1)需要注意的就是要从当前元素之后开始判断
(2)时间复杂度O(n^2);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值