排序算法(3)选择排序

排序算法(3)选择排序

 

原理:思想:两个变种(1)单侧选择:在一个无序数组中选择出每一轮中最大值(或最小值)元素,放到最前面或最后面(升序)(2)双向选择:在一个无序数组中选择出每一轮中最值元素,然后把这一轮中最前面的元素和min交换,最后面的元素和max交换;然后缩小范围(开始位置(begin++)++,最后位置(end–)--),重复上面步骤,最终得到有序序列(升序)。

 

代码实现:

单侧选择版:

void SelectSort1(int a[], int n)
{
	for (int i = 0; i < n; i++)
	{
		int temp = i;
		for (int j = i+1; j < n; j++)
		{
			if (a[temp] < a[j]) temp = j;//升序,改成 > 是降序
		}
		swap(a[i],a[temp]);
	}
}

 

双向选择版:

void SelectSort(int a[], int n)
{
	int begin = 0;
	int end = n - 1;
	while (begin < end)
	{
		int min = begin, max = begin;
		for (int i = begin; i <= end; i++)//得出这一段里的最大值和最小值
		{
			if (a[min] > a[i])
				min = i;
			if (a[max] < a[i])
				max = i;
		}
		//最小值与begin交换,最大值与end交换,升序。反之,是降序
		swap(a[min], a[begin]);
		if (max == begin)//如果首元素恰好是最大的,则需要先把min 和 max的位置交换,再交换,否则经过两次交换,又回到原来的位置
			max = min;
		swap(a[max], a[end]);
		begin++;
		end--;
	}
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值