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

在这里插入图片描述

本篇博客会讲解如何使用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);// 如果最左边本来就是最大值,就被换走了,需要修正maxiif (begin == maxi){maxi = mini;}Swap(a + maxi, a + end);++begin;--end;}
}

总结

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

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

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

相关文章

v-loading.fullscreen.lock

在Vue中&#xff0c;v-loading是一个自定义指令&#xff0c;用于显示加载状态的可复用指令。而v-loading.fullscreen.lock是v-loading指令的一种配置形式&#xff0c;用于在全屏加载时锁定页面。 通常&#xff0c;v-loading指令被用于在异步操作期间显示加载状态&#xff0c;以…

【数据结构】实现栈和队列

目录 一、栈1.栈的概念及结构&#xff08;1&#xff09;栈的概念&#xff08;2&#xff09;栈的结构 2.栈的实现&#xff08;1&#xff09;类型和函数的声明&#xff08;2&#xff09;初始化栈&#xff08;3&#xff09;销毁&#xff08;4&#xff09;入栈&#xff08;5&#x…

(未完成)【Spring专题】SringAOP底层原理解析——阶段三(AOP)

目录 前言前置知识代理范式Spring动态代理的实现 课程内容一、动态代理的实现1.1 Cglib动态代理1.2 JDK动态代理1.3 ProxyFactory&#xff1a;Spring对两种代理的封装 二、AOP基础知识2.1 AOP基础概念回顾2.2 SpringAOP实现方式的发展历程 三、底层源码解析3.1 概念回顾3.2 核心…

Hive字符串数组json类型取某字段再列转行

一、原始数据 acctcontent1232313[{"name":"张三","code":"上海浦东新区89492jfkdaj\r\n福建的卡"...},{"name":"狂徒","code":"select * from table where aa1\r\n and a12"...},{...}]...…

使用proxman对iOS真机进行抓包

1 打开手机的safari 输入地址 http://proxy.man/ssl 2 下载证书代开设置页面&#xff0c;安装证书 设置信任证书 打开手机设置 &#xff0c;点击通用 点击关于本机、 点击证书信任设置 打开信任设置开关 4 设置手机代理 查看需要设置的代理地址 打开界面 在手机中按…

音频4A算法导论

+我V hezkz17进数字音频系统研究开发交流答疑群(课题组) 一 音频4A算法是? 音频4A算法是指自动增益控制(Automatic Gain Control, AGC)、自动噪声抑制(Automatic Noise Suppression, ANS)和自动回声消除(Automatic Echo Cancellation, AEC),主动降噪ANC(Active Noi…

软考高级系统架构设计师系列论文第100篇:论软件的可维护性设计

软考高级系统架构设计师系列论文第100篇:论软件的可维护性设计 一、摘要二、正文三、总结一、摘要 2020年3月1日至12月20日,我参加了“数据安全访问平台”项目的开发,担任系统分析员的工作。该项目是某行业用户“数据中心二期”建设的主要内容,目标是:建立数据统一访问接口…

【Java 高阶】一文精通 Spring MVC - 转换器(五)

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

Ribbon:listOfServers

解释&#xff1a; 配置了address的地址,请求会走address&#xff0c;也就是http://127.0.0.1:8081&#xff0c;通常用户与别的后端服务进行联调设置为其本地服务的ip。 如果将address:注释掉。 会走后面的XXX.feign.default-server地址&#xff0c;这个地址通常可以配一个网关…

“深入解析JVM:理解Java虚拟机的工作原理和优化技巧“

标题&#xff1a;深入解析JVM&#xff1a;理解Java虚拟机的工作原理和优化技巧 摘要&#xff1a;本文将深入探讨Java虚拟机&#xff08;JVM&#xff09;的工作原理和优化技巧。我们将从JVM的基本结构开始&#xff0c;逐步介绍其工作原理&#xff0c;并提供一些实际示例代码&am…

解决v-if作用下popup弹框滑动效果消失的问题

问题描述 做需求的时候需要封装一个popup的组件&#xff0c;需求是页面进来的时候需要请求接口获取到popup的内容&#xff0c;然后进行展示弹框&#xff0c;但是这里就有一个问题&#xff0c;因为popup是一个组件&#xff0c;接口又是异步操作的&#xff0c;父组件进来的时候就…

【秋招基础】后端开发——笔面试常见题目

综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招算法的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于网上知识点进行的&#xff0c;每个代码参考热门博客和GPT3.5&#xff0…

python自动化入门之Python编写脚本实现自动化爬虫详解

想知道如何使用Python轻松高效地获取网络上的信息&#xff1f; 本篇文章将探索Python自动化爬虫&#xff0c;并展示如何编写实用的脚本。 1. 什么是Python爬虫&#xff1f; 爬虫顾名思义&#xff0c;就是像蜘蛛一样在网络上爬行&#xff0c;抓取各种有用信息的一种程序。而Pyt…

深入理解回调函数qsort:从入门到模拟实现

&#x1f341;博客主页&#xff1a;江池俊的博客 &#x1f4ab;收录专栏&#xff1a;C语言进阶之路 &#x1f4a1;代码仓库&#xff1a;江池俊的代码仓库 &#x1f3aa;我的社区&#xff1a;GeekHub &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐ 文章目录 前…

在树莓派上搭建web站点并发布互联网上线【无需公网IP】

文章目录 概述使用 Raspberry Pi Imager 安装 Raspberry Pi OS设置 Apache Web 服务器测试 web 站点安装静态样例站点将web站点发布到公网安装 Cpolar内网穿透cpolar进行token认证生成cpolar随机域名网址生成cpolar二级子域名将参数保存到cpolar配置文件中测试修改后配置文件配…

C/C++:C/C++在大数据时代的应用,以及C/C++程序员未来的发展路线

目录 1.C/C在大数据时代的应用 1.1&#xff1a;C/C数据处理 1.2&#xff1a;C/C数据库 1.3&#xff1a;C/C图像处理和计算机视觉 1.3.1&#xff1a;导读 2.C/C程序员未来的发展路线 2.1&#xff1a;图导 1.C/C在大数据时代的应用 C/C在大数据时代中仍然是一种被广泛应用的编…

小程序运营方式有哪些?如何构建小程序运营框架?

​如今&#xff0c;每个企业基本都做过至少一个小程序&#xff0c;但由于小程序本身不具备流量、也很少有自然流量&#xff0c;因此并不是每个企业都懂如何运营小程序。想了解小程序运营方式方法有哪些&#xff1f; 在正式运营小程序前&#xff0c;了解小程序的功能与企业实际经…

Webpack高频面试题

Webpack高频面试题 1 谈谈你对webpack的看法 现在的前端网页功能丰富&#xff0c;特别是SPA&#xff08;single page web application 单页应用&#xff09;技术流行后&#xff0c;JavaScript的复杂度增加和需要一大堆依赖包&#xff0c;还需要解决Scss&#xff0c;Less……新…

AS中回退git历史版本并删除历史提交记录

当您想把某个版本后的代码删除&#xff0c;回滚到指定的版本。可以使用一下的方法。 一、打开AS中git历史提交窗口 二、选择需要回滚的版本选项&#xff0c;右键弹出菜单。选择Reset Current Branch to Here... 三、选择 Hard 选项 soft&#xff1a;将合并的更改应用到当前分支…

【ARM】Day8 中断

1. 思维导图 2. 实验要求&#xff1a; 实现KEY1/LEY2/KE3三个按键&#xff0c;中断触发打印一句话&#xff0c;并且灯的状态取反 key1 ----> LED3灯状态取反 key2 ----> LED2灯状态取反 key3 ----> LED1灯状态取反 key3.h #ifndef __KEY3_H__ #define __KEY3_H__#in…