选择排序

选择排序

原理

选择排序通过每一趟遍历从待排序的元素中找到最大(最小)的元素,将找到的元素放至已排序的元素之后,直到最后一个元素放到指定位置。

思路

1、首先从原始序列中找到最大(最小)的元素,将最大(最小)的元素和第1个元素交换位置
2、再遍历剩余的n-1元素(即未排序元素),找到其中最大(最小)的元素,将最大(最小)元素和第2个元素交换位置(即和未排序元素的第1个元素交换位置)
3、以此,对剩余的n-i未排序元素重复进行第二步操作,每次都将最大(最小)元素交换至第i+1个位置(未排序元素的第1个位置),直到未排序元素个数为0,则完成排序。

过程

对序列5,8,5,6,2;实现从大到小排序

第一轮排序过程:
在这里插入图片描述
第二轮排序过程:
在这里插入图片描述
第三轮排序过程:
在这里插入图片描述
第四轮排序过程:
在这里插入图片描述

实现

// 选择排序
void selectionSort(int array[], int len)
{
	int max,temp;
	for (int i = 0; i < len; i++)
	{
		max = i;  // 假设未排序元素第一个位置为最大元素
		for (int j = i; j < len; j++)
		{
			if (array[j] > array[max])
				max = j;
		}
		if (max != i)  // 最大元素未在正确位置
		{
			temp = array[i];
			array[i] = array[max];
			array[max] = temp;
		}
	}
}

算法性能

时间复杂度
需要进行n次排序,每次排序的操作次数依次为n,n-1,…,2,1,所以时间复杂度为O(n^2);

算法稳定性
从图示的排序过程中,可以看出选择排序后有可能改变相同元素的相对位置,所以该算法是不稳定的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值