ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

直接选择排序

2021-11-29 20:00:12  阅读:176  来源: 互联网

标签:begin 直接 end int 元素 选择 maxi array 排序


文章目录


一、直接选择排序的基本思想

选择排序就是每一次从待排序的数据元素当中,选择最小或者最大的一个元素,如果是选最小的,就放序列的起始位置(假如是升序),如果是选最大的,就放在序列的末尾(假如是升序),直到全部待排序的数据元素排完 。
直接选择排序:

  • 在元素集合array[i]–array[n-1]中选择关键码最大(小)的数据元素
  • 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换在剩余的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重复上述步骤,直到集合剩余1个元素
  • 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换在剩余的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重复上述步骤,直到集合剩余1个元素

在这里插入图片描述

二、代码实现

代码如下(示例):

void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

//每次选取一个数
void SelectSort1(int* a, int n)
{
	int begin = 0, end = n - 1;
	while (begin < end)
	{
		int max = begin;//每次都将begin(也就是0)赋给max
		for (int i = begin; i <= end; i++)
		{
			if (a[i] > a[max])//找比a[max]大的数,找到了就改变max的值
			{
				max = i;
			}
		}
		Swap(&a[max], &a[end]);
		end--;//因为每次内层循环结束,最后一个数就是最大的了,所以就不需要再进行选择
	}
}

//进行优化,每次选取两个数(最大数和最小数),遍历的次数是前者的一半
void SelectSort(int* a, int n)
{
	int begin = 0, end = n - 1;
	while (begin < end)//当begin<end的时候,说明[begin,end]这区间里面的数没有排序
	{
		int mini = begin;
		int maxi = begin;
		for (int i = begin; i <= end; i++)
		{
			if (a[i] < a[mini])
			{
				mini = i;
			}
			if (a[i] > a[maxi])
			{
				maxi = i;
			}
		}
		Swap(&a[begin], &a[mini]);
		if (maxi == begin)//maxi下标的值如果被换到mini下标处,此时需要调整位置
		{
			maxi = mini;
		}
		Swap(&a[end], &a[maxi]);
		++begin;
		--end;
	}
}

第二种方式中,为什么maxi有时候需要进行调整位置?
请看图:
在这里插入图片描述
还有一种选择排序——堆排序----》点击我,查看堆排序的实现以及相关细节


总结

1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1)
4. 稳定性:不稳定

标签:begin,直接,end,int,元素,选择,maxi,array,排序
来源: https://blog.csdn.net/qq_56044032/article/details/121603510

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有