选择排序:用C语言打造高效的排序算法

news2025/1/10 16:42:09

在这里插入图片描述

本篇博客会讲解如何使用C语言实现选择排序。

下面我来画图讲解选择排序的思路。

假设有一个数组,其初始状态如下,我们想把这个数组排成升序。
在这里插入图片描述
首先我们标明范围,即[begin, end],一开始begin(b)和end(e)分别表示数组的第一个位置和最后一个位置,我们要找到[begin, end]中的最小的数据(1)和最大的数据(5),并且把最小的数据换到最左边,最大的数据换到最右边。

交换前:
在这里插入图片描述

交换后:
在这里插入图片描述
此时两边的数据就排好了,接下来需要排中间的n-2个数据,我们分别让begin和end向中间走一步,重复刚刚的操作,找出[begin, end]中最小的数(2)和最大的数(4),分别换到最左边和最右边:

交换前:
在这里插入图片描述
交换后:
在这里插入图片描述

接着再让begin和end往中间走,重复上面的步骤,直到begin和end相遇为止。

需要注意的是,在把最小的数据往左边换时,如果最左边的数据刚好是最大的数据,交换之后,最大的数据的位置就变了,此时需要更新最大的数据的位置。

对于选择排序,每一趟选出最小数和最大数的遍历次数是逐渐减少的,每次减少2,其总次数是一个公差为2的等差数列求和,其时间复杂度为O(N2)。由于选择排序消耗常数的额外空间,所以其空间复杂度为O(1)。

下面来讨论选择排序的稳定性。选择排序是非常具有误导性的,很多人可能会认为选择排序是一个稳定的排序,事实上是不稳定的,下面我举一个反例。假设一个数组的初始状态如下:
在这里插入图片描述
当我们把最小数(2)与最左边的数据交换时,会改变两个3的相对顺序。所以,选择排序有可能会改变相同的数据的相对顺序,故选择排序是不稳定的。

代码如下:

void SelectSort(int* a, int n)
{
	assert(a);

	int begin = 0;
	int end = n - 1;
	while (begin < end)
	{
		// 找出[begin, end]的最小值和最大值的下标
		int maxi, mini;
		maxi = mini = begin;
		for (int i = begin + 1; i <= end; ++i)
		{
			if (a[i] > a[maxi])
			{
				maxi = i;
			}
			if (a[i] < a[mini])
			{
				mini = i;
			}
		}

		// 分别把最小值和最大值换到两边
		Swap(a + mini, a + begin);
		// 如果最左边本来就是最大值,就被换走了,需要修正maxi
		if (begin == maxi)
		{
			maxi = mini;
		}

		Swap(a + maxi, a + end);

		++begin;
		--end;
	}
}

总结

选择排序使用一种“选数”的思路,其方法简单粗暴,通过遍历的方式每次找出最小数和最大数,并将其分别换到最左边和最右边。其时间复杂度为O(N2),空间复杂度为O(1)。选择排序是不稳定的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/918137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【黑马头条之热点文章kafkaStream】

本笔记内容为黑马头条项目的热点文章-实时计算部分 目录 一、实时流式计算 1、概念 2、应用场景 3、技术方案选型 二、Kafka Stream 1、概述 2、Kafka Streams的关键概念 3、KStream 4、Kafka Stream入门案例编写 5、SpringBoot集成Kafka Stream 三、app端热点文章…

验证码识别DLL ,滑块识别SDK,OCR图片转文字,机器视觉找物品

验证码识别DLL ,滑块识别SDK 你们用过哪些OCR提取文字&#xff0c;识图DLL&#xff0c;比如Opencv,Labview机器视觉找物品之类&#xff1f;

数据库第十五课-------------非关系型数据库----------Redis

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

第三方软件测试都有哪些?

第三方软件测试 第三方软件测试是一种软件测试活动&#xff0c;旨在确保软件的质量、功能、性能和安全性等方面符合预期要求。 一、以下是一些常见的第三方软件测试类型&#xff1a; 兼容性测试&#xff1a;测试软件在不同操作系统、浏览器、数据库等环境下的兼容性。 功能测…

计费时间与非计费时间:工时表如何帮助你平衡两者?

正确分配时间是企业管理员工的必要条件&#xff0c;这意味着了解并了解如何管理计费时间和非计费时间。更重要的是&#xff0c;需要能够在两者之间找到适当的平衡&#xff0c;这样才能最大限度地提高生产力、消除业务中的低效率并提高利润。 什么是计费时间和非计费时间&#x…

Python“牵手”天眼查、企查查、启信宝企业数据API接口运用场景及功能介绍

天眼查企业信用查询app是一款企业数据信息查询软件&#xff0c;专注服务于个人与企业信息查询,是人人都在用的商业安全工具。本软件整合了国内所有企业数据信息&#xff0c;用户可以使用这款软件查询企业单位相关信息&#xff0c;只要在线输入企业名称&#xff0c;就可以为您搜…

网络互联与互联网 - TCP 协议详解

文章目录 1 概述2 TCP 传输控制协议2.1 报文格式2.2 三次握手&#xff0c;建立连接2.3 四次挥手&#xff0c;释放连接 3 扩展3.1 实验演示3.2 网工软考 1 概述 在 TCP/IP 协议簇 中有两个传输协议 TCP&#xff1a;Transmission Control Protocol&#xff0c;传输控制协议&…

每日后端面试5题 第八天

1.UDP和TCP协议的区别 1.UDP无连接&#xff0c;速度快&#xff0c;安全性低&#xff0c;适合高速传输、实时广播通信等。 2.TCP面向连接&#xff0c;速度慢&#xff0c;安全性高&#xff0c;适合传输质量要求高、大文件等的传输&#xff0c;比如邮件发送等。 &#xff08;还…

C语言学习系列-->【关于qsort函数的详解以及它的模拟实现】

文章目录 一、概述二、qsort函数参数介绍三、qsort实现排序3.1 qsort实现整型数组排序3.2 qsort实现结构体数组排序 四、模拟实现qsort函数 一、概述 对数组的元素进行排序 对数组中由 指向的元素进行排序&#xff0c;每个元素字节长&#xff0c;使用该函数确定顺序。 此函数使…

Vue中ElementUI结合transform使用时,发现弹框定位不准确问题

在近期开发中&#xff0c;需要将1920*1080放到更大像素大屏上演示&#xff0c;所以需要使用到transform来对页面进行缩放&#xff0c;但是此时发现弹框定位出错问题&#xff0c;无法准备定位到实际位置。 查看element-ui官方文档无果后&#xff0c;打算更换新的框架进行开发&am…

学校宿舍门禁:如何做好考勤管理?

随着科技的不断发展&#xff0c;传统的考勤方式逐渐显现出其局限性&#xff0c;而人脸识别技术作为一种快速、准确、无需直接接触的身份验证手段&#xff0c;为宿舍管理带来了全新的可能性。 宿舍管理能够让管理员随时通过系统监控宿舍内的人员流动情况&#xff0c;当系统检测到…

【Nginx】Nginx 简介

Ngnix 特点 模块化设计&#xff1a;良好的扩展性&#xff0c;可以通过模块方式进行功能扩展。高可靠性&#xff1a;主控进程和 worker 是同步实现的&#xff0c;一个 worker 出现问题&#xff0c;会立刻启动另一个 worker。内存消耗低&#xff1a;一万个长连接&#xff08;kee…

ASE 基础知识

笔记&#xff1a; 1&#xff0c;颜色&#xff0c;贴图 2&#xff0c;加减乘除 3&#xff0c;菲涅尔、sin&#xff0c;float、vector、time 4&#xff0c;漫反射&#xff0c;法线&#xff0c;自发光&#xff0c;金属度&#xff0c;反射&#xff0c;AO明暗&#xff0c;折射&#…

[保研/考研机试] KY190 查找第K小数 北京邮电大学复试上机题 C++实现

题目链接&#xff1a; 查找第K小数_牛客题霸_牛客网查找一个数组的第K小的数&#xff0c;注意同样大小算一样大。 如 2 1 3 4 5 2 第三小数。题目来自【牛客题霸】https://www.nowcoder.com/share/jump/437195121692786918857 描述 查找一个数组的第K小的数&#xff0c;注意…

正中优配:创业板一天最多涨多少?

创业板是我国股票商场的一个特定板块&#xff0c;它首要涵盖了草创公司、小微企业和新型产业的股票买卖。作为股票商场的重要组成部分&#xff0c;创业板的涨跌对于投资者和商场参与者来说具有必定的影响力。那么&#xff0c;创业板一天最多能够涨多少呢&#xff1f;本文将从多…

2023年机遇与挑战:裁员速度逐渐趋缓 | 百能云芯

随着2023年已经过半&#xff0c;美国湾区的科技公司仍在进行着内部结构的调整&#xff0c;以适应不断变化的市场环境。然而&#xff0c;从裁员人数来看&#xff0c;这一调整似乎已经进入了一个步伐逐渐放缓的阶段。 根据公开文件显示&#xff0c;英特尔、SPT MicroElectronics和…

配置禁止生成可执行文件-火绒法

防止黑客利用漏洞上传可执行文件的方法&#xff0c;可以尝试通过文件服务器资源管理器(FSRM)设置文件屏蔽防止黑客利用漏洞上传特定类型的非法文件(.asp .aspx .jsp .php)。要是系统问题不能使用(FSRM)&#xff0c;可以用火绒来干这个事儿。方法如下&#xff1a; 配置方法 火…

Python“牵手”阿里巴巴商品详情API接口运用场景及功能介绍

阿里巴巴电商API接口是针对阿里巴巴提供的电商服务平台&#xff0c;为开发人员提供了简单、可靠的技术来与阿里巴巴电商平台进行数据交互&#xff0c;实现一系列开发、管理和营销等操作。其中包括商品详情API接口&#xff0c;通过这个API接口商家可以获取商品的详细信息&#x…

大神闭关7天整理!137页Python学习笔记,全面总结看这一篇就够了

Python作为当下最热门的编程语言之一&#xff0c;从前几年一直火到现在&#xff0c;并且还有更甚的趋势。不仅吸引了众多业内人士&#xff0c;圈外人士也纷纷加入了学习Python的阵营之中。 但很多朋友在学习Python时&#xff0c;直呼&#xff1a;太难了&#xff0c;学不会&…