【排序】选择排序(含优化版)

本章我们继续讲排序算法,这里我们将学习选择排序,也是一个很普遍很常见的排序算法,逻辑和代码都比较简单,比较容易掌握,我们直接走起

选择排序

基本思想:选择排序(SelectSort),即每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完

我们这里以排升序为例

选择排序与冒泡排序一样,也分为内层循环和外层循环,内层循环是找出最小的元素放到未排序数组的第一位,外层循环按照内层逻辑,一步一步的将元素由小到大依次放到数组内,完成排序

单趟逻辑:单趟排序就是从记录本次循环的第一个元素,依次向后比较,若后面的元素大于记录的元素,那么就将记录的元素换为更小的元素,并记录此时记录元素的下标方便在出循环后进行交换,找到数组末尾,本次单趟循环结束,此时记录的元素就是最小元素,那么我们就进行交换

整体逻辑:沿用单趟逻辑,多次进行排序,若有n个数据,那么就需要外层循环n-1次,将数据全部排好。

逻辑图

代码实现

void SelectSort(int* a, int n)
{for (int i = 0; i < n - 1; i++){int tmp = a[i];int k = i;for (int j = i + 1; j < n; j++){if (a[j] < tmp){tmp = a[j];k = j;}}Swap(&a[i], &a[k]);}
}

优化

思路:上面的选择排序是基本的选择排序,我们可以发现,他每次循环都需要遍历未排序的数组去寻找最小的元素,那么我们换一种思路,如果我们在遍历未排序的数组时,同时找到最大的元素和最小的元素,是不是就减少了一半的循环量,思路有了,我们就直接开始实现

总体的思路还是和上面大差不差,但是这次我们需要多建一个变量end,来记录数组末尾的位置

然后依次进行遍历,之前我们用tmp记录最小的数,这里就需要用两个变量max 和 min来分别记录最大值和最小值,为了方便我们直接记录下标,这样就不用新建变量来记录下标了,而且还可以直接进行比较

流程图

 优化代码(有瑕疵)
void SelectSort(int* a, int n)
{int begin = 0;int end = n - 1;while (begin < end){int min = begin;int max = begin;for (int i = begin + 1; i <= end; i++){if (a[i] > a[max]){max = i;}if (a[i] < a[min]){min = i;}}Swap(&a[begin], &a[min]);Swap(&a[end], &a[max]);begin++;end--;}
}

看了上面的分析和代码的实现,也许你会认为,这样就完成选择排序的优化,但是事实真的如此吗,先说结论,这个排序逻辑确实是这样的,代码基本也是对的,可以完成大多数的排序,但是有个别情况,是无法进行正确排序的,因此上面实现的是有瑕疵的

我们来分析一下,当第一轮排序时,我们上面的代码会记录

max为0,min为 1 ,begin为0,end为7

进行交换的时候,先交换begin和min

结果为 1   9  2   5   7  4   6  3

再交换max和end的时候

结果为 3    9    2    5   7    4   6   1

很显然,已经出错了,max在和end进行交换的时候,max已经变换了位置,因此我们找到了问题,找到了问题之后,我们就需要解决问题

我们只需要加一个判断条件,当最大值为begin时,第一步begin和min交换就会把max的值交换走,这时我们需要进行判断,如果begin==max,那么就将max的值赋为min,即此时最大值被交换到的位置,再进行第二步交换即可。

优化代码最终实现
void SelectSort(int* a, int n)
{int begin = 0, end = n - 1;while (begin < end){int mini = begin, maxi = 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[begin], &a[mini]);if (begin == maxi)maxi = mini;Swap(&a[end], &a[maxi]);++begin;--end;}
}

 总结(冒泡排序和选择排序的区别)

冒泡排序的时间复杂度为O(n^2),其中n是要排序的元素数量。这是因为冒泡排序需要进行多次遍历,每次遍历都需要比较和交换元素。因此,对于大规模数据的排序,冒泡排序可能不是最有效的选择。
选择排序的时间复杂度也是O(n^2),但它的性能通常优于冒泡排序。因为选择排序只需要进行一次遍历,并且只需要进行一次比较和交换操作。因此,在处理大规模数据时,选择排序通常更为高效。

但如果遇到已经排好序的数据,冒泡排序只需要循环一次就能发现,并终止,但选择排序却需要继续遍历数组,在这一点上选择排序的效率是不如冒泡排序的。

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

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

相关文章

Layui2.5.6树形表格TreeTable使用

1、问题概述? Layui2.5.6的树形表格-TreeTable终于用明白了,步骤详细,提供源码下载。 如果你使用的是Layui2.8+版本,那么点个赞,赶紧去官网看吧,官网更行了。 更新地址:树表组件 treeTable - Layui 文档 最近在项目中需要使用到树形表格,用来显示菜单的层级关系,当…

辩证 逻辑学 | 洞察 事物矛盾及变化规律 在形式逻辑基础上 学会辩证思维(40节课)

课程下载&#xff1a;辩证逻辑学洞察事物矛盾及变化规律在形式逻辑基础上学会辩证思维&#xff08;40节课&#xff09;-课程网盘链接提取码下载.txt资源-CSDN文库 更多资源下载&#xff1a;关注我。 在形式逻辑的基础上&#xff0c;学会 辩证思维 敏锐 洞察事物发展变化的规…

Linux命令篇(一):文件管理部分

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 1、cat命令常用参…

童趣盎然,米香四溢 —— 蒙自源六一儿童节特别献礼

充满欢声笑语的六一儿童节马上就要来了&#xff0c;在这个充满童真和喜悦的时刻&#xff0c;蒙自源米线品牌以一颗童心&#xff0c;为所有大朋友和小朋友准备了一份特别的礼物。 从5月25日开始&#xff0c;蒙自源诚挚邀请您和孩子们一同前往蒙自源旗下各大门店&#xff0c;品尝…

【MySQL数据库】MySQL 高可用搭建方案——MHA实战

MHA&#xff08;Master High Availability&#xff09; MHA实战 MHA&#xff08;Master High Availability&#xff09; 一、MHA简介二、MHA搭建准备要求&#xff1a;mha集群搭建&#xff0c;4台服务器&#xff0c;1主2从&#xff0c;1台mha2.1实验思路2.2实验准备 三、搭建MyS…

HTML5常用标签表格

04-08、表格标签table 概述 表格&#xff1a;是一种行和列组合而成的单元格。一般应用于后台网页设计管理数据使用。 表格的架构部分&#xff1a; tabletable head 表格头 theadtable body - 表格体 tbodytable foot -表格的页脚 tfoot 表格的基本组成部分&#xff1a; t…

opencv-python(三)

马赛克 face img[162:428,297:527] # 人脸坐标区域face face[::10,::10] # 每10个中取出一个像素&#xff0c;马赛克face np.repeat(face, 10, axis0) # 行方向重复10次face np.repeat(face, 10, axis1) # 列方向重复10次img[162:428,297:527] face[:266,:230] # 填充&a…

计算机科学与技术和软件工程专业有什么区别?应该怎么选?

计算机科学与技术和软件工程都是就业前景较好的计算机类专业&#xff0c;二者密切相关但侧重点不同&#xff0c;同学们应该如何选择呢&#xff1f; 一、学习内容 1.学科定位 ● 计算机科学与技术 侧重于计算机科学的理论研究和基础技术&#xff0c;包括算法、数据结构、人工…

lnmp平台部署web应用,安装Discuz社区平台详细文章——更新中

Nginx网站service 详细相关介绍-特点-http状态码-配置文件、将nginx添加永久环境变量 访问网站404是什么&#xff1f;_nginx 稳定版-CSDN博客文章浏览阅读1.2k次&#xff0c;点赞33次&#xff0c;收藏24次。开源Web服务器软件。_nginx 稳定版https://blog.csdn.net/2301_771619…

数据结构--数组(详细分析)

目录 &#x1f349;引言 &#x1f349;数组 &#x1f348;数组的特性 &#x1f348;数组的优缺点 &#x1f34d;优点&#xff1a; &#x1f34d;缺点&#xff1a; &#x1f348;数组的声明与初始化 &#x1f348;数组的常见操作 &#x1f34d; 插入操作 &#x1f34d;…

Touch Camera PRO 2024 Easy Mobile Desktop Camera Controller(触控相机专业版)

一个真正易于使用的移动+台式摄像机控制器,具有视角切换功能! Touch Camera PRO 是一款非常易于使用的移动+桌面相机控制器,具有透视切换功能!它在 Home Designer、Runtime Level Editor 和 Floor Map Designer 等其他插件中使用! 在桌面和移动设备上工作! 一个干…

WIireShark使用教程

文章目录 目录 文章目录 一.入门抓包示例 一.入门抓包示例 先介绍一下如何使用wireshark抓取相应网卡的流量&#xff0c;让读者可以先上手操作感受一下抓包的具体过程。 1.打开wireshark的主界面如下 2.选择需要抓包的网卡&#xff0c;鼠标左键双击&#xff0c;即可抓取该网…

Mysql常见问题总结

1、MySQL初始化报错 mysqld --initialize --usermysql --console 2024-06-02T15:52:22.645557Z 0 [System] [MY-013169] [Server] D:\installSoft\mysql-8.0.21-winx64\bin\mysqld.exe (mysqld 8.0.21) initializing of server in progress as process 8980 2024-06-02T15:52:2…

量子加速超级计算简介

本文转载自&#xff1a;量子加速超级计算简介(2024年 3月 13日) By Mark Wolf https://developer.nvidia.cn/zh-cn/blog/an-introduction-to-quantum-accelerated-supercomputing/ 文章目录 一、概述二、量子计算机的构建块&#xff1a;QPU 和量子位三、量子计算硬件和算法四、…

【IC验证】一文速通多通道数据整型器(MCDF)

目录 01 README 02 MCDF设计结构 2.1 功能描述 2.2 设计结构 2.3 接口与时序 2.3.1 系统信号接口 2.3.2 通道从端接口 2.3.3 整形器接口 2.3.4 控制寄存器接口 2.3.4.1 接口时序图 2.3.4.2 各数据位信息 03 验证框图 3.1 reg_pkg 3.1.1 reg_trans 3.1.2 reg_driv…

【一刷《剑指Offer》】面试题 27:二叉搜索树与双向链表

牛客对应题目链接&#xff1a;二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com) 力扣对应题目链接&#xff1a;LCR 155. 将二叉搜索树转化为排序的双向链表 - 力扣&#xff08;LeetCode&#xff09; 一、《剑指 Offer》对应内容 二、分析题目 上面力扣上的这道题目和牛客…

AGM DAP-LINK 离线烧录报错信息分析

DAP-LINK 支持离线烧录。 即&#xff1a;先把要烧录的bin 烧录到DAP-LINK 中&#xff1b;然后DAP-LINK 可以脱离PC&#xff0c;上电后通过按键对目标板进行烧录。 CMSIS-DAP模式 跳线JGND断开&#xff0c;状态LED D4快闪&#xff0c;D3常亮&#xff08;串口状态&#xff09;。…

接口设计的最佳实践-下篇

大多数程序员&#xff0c;做得最多的事&#xff0c;也不过是写接口这件事而已。 今天继续总结下接口设计需要注意的点。尽量每种都给出具体的场景、案例等&#xff0c;希望大家能有所收获。 1、接口幂等 幂等性&#xff1a;是指一个操作或者一个服务&#xff0c;无论执行多少…

Vue3 - Mac系统用文本编辑写html不显示效果的坑

平时在win系统下&#xff0c;可以直接对文本进行编辑&#xff0c;非常的舒服。 在mac系统中&#xff0c;也有类似的功能&#xff0c;就是文本编辑&#xff0c;没想到居然还有坑。 这是我mac系统中创建的html文件&#xff0c;想着没有几行代码&#xff0c;就没有开编辑器了&am…

C语言 | Leetcode C语言题解之第125题验证回文串

题目&#xff1a; 题解&#xff1a; bool isalumn(char c) {return (c > a && c < z) || (c > A && c < Z) || (c > 0 && c < 9); }bool isPalindrome(char* s) {for (int left 0, right strlen(s) - 1; left < right; left, …