前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【数据结构】排序算法系列——选择排序(附源码+图解)

【数据结构】排序算法系列——选择排序(附源码+图解)

作者头像
Skrrapper
发布2024-09-12 12:23:36
1250
发布2024-09-12 12:23:36
举报
文章被收录于专栏:技术分享

选择排序

算法思想

选择排序的思想与插入排序其实有异曲同工之处,它们都会对数据进行比较和交换,但是它们也还是有很大的差别:插入排序是两两元素之间进行比较,而选择排序是将最值的元素同其他元素依次进行比较,从而按照最大(或最小)、第二大、第三大这样的顺序进行数组的重组。

它的大致步骤如下:

  1. 第一次从待排序的数据元素中选出**最小(或最大)**的一个元素,存放在序列的起始(末尾)位置
  2. 然后选出**次小(或次大)**的一个元素,存放在最大(最小)元素的下一个位置
  3. 重复这样的步骤直到全部待排序的数据元素排完
图解
请添加图片描述
请添加图片描述
C语言代码分析
代码语言:javascript
复制
//选择排序
void SelectSort1(int* a, int n);
void SelectSort2(int* a, int n);

//1.只进行最小值或者最大值的交换
void SelectSort1(int* a, int n)
{
	int left = 0;
	int right = n - 1;
	while (left < right)
	{
		int min = left;//指定目前最小值为第一个元素
		for (int i = left + 1; i <= right; i++)
		{
			if (a[i] < a[min])//如果有比目前最小值更小的元素,就更新最小值,进行交换
			{
				min = i;
			}
		}
		if (min != left)//如果最小值不是第一个元素,就进行Swap交换
		{
			int temp = a[min];
			a[min] = a[left];
			a[left] = temp;
		}
		left++;//每完成一次交换,左指针向右移动一位,进行下一次交换
	}
}


//2.最小值和最大值同时进行交换,优点是减少了交换次数,在一定程度上提高了效率
void SelectSort2(int* a, int n)//选择排序
{
	int left; int right = n - 1;//左右指针
	while (left < right)
	{
		int min = left, max = right;//最小值和最大值的下标
		for(int i=left+1;i<=right;i++)
		{
			if (a[i] < a[min])//找最小值
				min = i;
			if (a[i] > a[max])//找最大值
				max = i;
		}
		if (min != left)
		{
			//进行一次Swap交换
			int temp = a[min];
			a[min] = a[left];
			a[left] = temp;
		}
		//如果最大值和最小值相等,说明最大值和最小值是同一个元素,只需要进行一次交换
         //如果继续交换max,就会将最小值交换到末尾位置。
		if (left = right)
		{
			right = min;
		}
		left++;
		right--;

}
时间复杂度

选择排序的最优时间复杂度、平均时间复杂度和最坏时间复杂度均为O(n2)

稳定性

鉴于选择排序会改变前后元素的相对位置,所以:不稳定

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 选择排序
    • 算法思想
      • 图解
        • C语言代码分析
          • 时间复杂度
            • 稳定性
            相关产品与服务
            腾讯云代码分析
            腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档