“简单易懂的排序:深入了解直接选择排序“

文章目录

  • 🔍 选择排序的原理与过程
  • 📈 选择排序的优缺点
  • 👉 代码实现

🔍 选择排序的原理与过程

本文我们直接说一个优化过的直接选择排序。其思路大同小异.

  • 选择排序的思路很简单
    每次从待排序的数据中选择一个最小和最大的元素,最小的存放在序列的起始位置,最大的元素放在序列的尾部,直到全部待排序的数据元素排完 。
  1. 在元素集合array[i]–array[n-1]中选择关键码最大和最小的数据元素.
  2. 找到最大值将其和数据序列末尾交换,找到最小值将其跟数据序列起始位置交换
  3. 在剩余的array[i+1]–array[n-2]集合中,重复上述步骤,直到集合剩余1个元素.

  • 数据演示
    在这里插入图片描述
  1. 第一轮取数结果
    在这里插入图片描述
    在这里插入图片描述
  2. 第二轮取数结果

在这里插入图片描述
在这里插入图片描述
3. 第三轮取数结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/7a33b3495bdf45afa6dfa544680aa808.png
在这里插入图片描述


📈 选择排序的优缺点

直接选择排序的特性总结:

  • 优点
  1. 实现简单:选择排序的实现非常简单,容易理解和实现,不需要复杂的数据结构或算法思想,适合初学者或快速解决一些小型排序问题。
  2. 空间复杂度低:选择排序只需要用到常数个变量作为辅助空间,不需要额外开辟内存空间来存储排序结果,因此空间复杂度较低.所有他的空间复杂度为O(1)
  • 缺点:
  1. 时间复杂度高:选择排序的时间复杂度为O(n^2),其中n是数组长度,因此性能较差,不适合处理较大规模的数据。
  2. 不稳定:选择排序的交换过程可能会破坏数组中相同大小元素的稳定性,因此选择排序是一种不稳定的排序算法。

👉 代码实现

void SelectSort(int* a, int n)
{int begin = 0, end = n - 1; // 定义排序区间的起点和终点while (begin < end) // 当起点小于终点时,继续排序{int maxi = begin, mini = begin; // 定义当前区间最大值和最小值的下标for (int i = begin; 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; // 终点向左移动一位}
}

代码实现起来比较简单:
但是要注意一个点如果最大值下标和起点下标重叠,需要做一下处理.

  if (begin == maxi) {maxi = mini;}

这行代码的意思是判断最大值下标是否和起点下标重叠,如果重叠则最大值已经被移动到了最小值下标处了,需要将最大值下标更新为最小值下标,否则下一步交换操作会将最大值和起点处的元素交换,而不是最大值和终点处的元素交换。举个例子

当待排序数组为 {5, 2, 3, 4, 1} ,第一轮排序时,最小值为1,最大值为5,
第一次swap交换后数组变为 {1, 2, 3, 4, 5},在第二次swap交换时如果没有判断:此时的最大值下标仍然指向起点位置,直接swap交换则数据会变成{5,2,3,4,1},导致排序错误。如加上判断:更新maxi的下标, maxi = mini;此时maxi的下标指向了4,再次swap数据.排序成功。因此,需要判断最大值下标和起点下标是否重叠,如若重叠,需要将最大值下标更新为最小值下标,即maxi=mini。

  • 图析:
  1. 在没有判断条件下进行:
    在这里插入图片描述
    在这里插入图片描述
    此时的maxi还依然指向begin起始位置,再次交换就会出错.
    在这里插入图片描述
  2. 加上判断条件的进行
    在这里插入图片描述
    在这里插入图片描述
    加上判断条件后 if(begin == maxi)成立,则maxi = mini;在这里插入图片描述
    排序成功.
  • 选择排序的优点是简单易懂,缺点是效率低,不适用于大规模数据的排序。在实际应用中,一般用来作为其他排序算法的子过程。但是该选择排序算法还是值得我们去学习摸索的,

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

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

相关文章

fatal: unable to access ‘http://xxxx‘: Empty reply from server

当你遇到 “fatal: unable to access ‘http://xxxx’: Empty reply from server” 的错误信息时&#xff0c;通常表示 Git 客户端无法连接到指定的服务器或仓库。 以下是一些可能导致该错误的原因以及一些排除故障的步骤&#xff1a; 错误的 URL&#xff1a;确保你提供的 URL…

pdf转图片操作方法是什么?分享两个简单的方法!

PDF转图片是一个常见的需求&#xff0c;无论是为了方便编辑、共享&#xff0c;还是为了其他用途&#xff0c;我们需要简单而有效的方法来实现这个目标。本文将介绍两种简单的PDF转图片方法&#xff1a;记灵在线工具和截图方法。 记灵在线工具是一个强大而易于使用的在线工具&a…

UNIX网络编程卷一 学习笔记 第二十三章 高级SCTP套接字编程

SCTP是一个面向消息的协议&#xff0c;递送给用户的是部分的或完整的消息。只有当发送大消息时&#xff0c;在对端才会递送部分的消息。部分消息被递送给应用后&#xff0c;多个部分消息组合成单个完整消息不由SCTP负责。在SCTP应用进程看来&#xff0c;一个消息既可由单个输入…

Mars3d采用ellipsoid球实现模拟地球旋转效果

1.Mars3d采用ellipsoid球实现模拟地球旋转效果 2.开始自选装之后&#xff0c;模型一直闪烁 http://mars3d.cn/editor-vue.html?idgraphic/entity/ellipsoid 3.相关代码&#xff1a; import * as mars3d from "mars3d"export let map // mars3d.Map三维地图对象 …

WPS Office AI实战:智能表格化身智能助理

前面我们已经拿 WPS AI 对Word文字、PPT幻灯片、PDF 做了开箱体验&#xff0c;还没有看过的小伙伴&#xff0c;请翻看以前的文章&#xff0c;本文开始对【智能表格】进行AI开箱测验。 表格在日常的数据处理中占绝对地位&#xff0c;但表格处理并不是每一个人都擅长&#xff0c;…

第2讲 KMD ISP子系统缩略词及目录结构

QCOM Camera子系统缩略词介绍 CPAS(Camera Peripherals and Support)CDM(Camera Data Mover)TFE(Thin Front End)IFE(Image Front End)OPE(Offline Processing Engine)BPS(Bayer Processing Segment)SFE(Sensor Front End)LRME(Low Resolution Motion Estimation)CSID(Camera …

taro3 微信小程序 createIntersectionObserver 监听无效

项目&#xff1a; taro3 vue3 官方文档 版本&#xff1a;3.x Taro.createIntersectionObserver(component, options) 创建并返回一个 IntersectionObserver 对象实例。在自定义组件或包含自定义组件的页面中&#xff0c;应使用 this.createIntersectionObserver([options]) …

常见面试题之垃圾收回

1. 简述Java垃圾回收机制&#xff1f;&#xff08;GC是什么&#xff1f;为什么要GC&#xff1f;&#xff09; 为了让程序员更专注于代码的实现&#xff0c;而不用过多的考虑内存释放的问题&#xff0c;所以&#xff0c;在Java语言中&#xff0c;有了自动的垃圾回收机制&#x…

性能测试工具 jmeter 录制脚本,传递 cookie,循环执行接口

目录 前言&#xff1a; 代理录制脚本 循环重复添加接口 登录并传递 cookie 给新建产品接口 循环执行脚本 前言&#xff1a; 在使用JMeter进行性能测试时&#xff0c;录制脚本是一种常用的方法。录制脚本可以帮助你捕获和重放用户与应用程序之间的交互&#xff0c;以模拟真…

阿里云域名注册域名持有者信息模板创建流程(图文)

阿里云域名注册域名持有者个人或企业都需要有已经通过实名认证的信息模板&#xff0c;如果没有可用的信息模板&#xff0c;需要先创建信息模版&#xff0c;等待信息模板实名通过后才可以注册域名&#xff0c;阿里云百科来详细说下阿里云注册域名创建信息模板实名全过程&#xf…

对 Jenkins+ANT+Jmeter 接口测试的实践

目录 1、前言 2、框架与数据准备 3、脚本设计 4、整理测试报告 1、前言 JenkinsANTJMeter是一种常见的接口测试实践方案&#xff0c;可以实现自动化的接口测试和持续集成。Jenkins是一个流行的持续集成工具&#xff0c;ANT是一个构建工具&#xff0c;而JMeter是一个功能强大…

二次元少女-InsCode Stable Diffusion 美图活动一期

一、 Stable Diffusion 模型在线使用地址&#xff1a; https://inscode.csdn.net/inscode/Stable-Diffusion 二、模型相关版本和参数配置&#xff1a; 模型版本&#xff1a;chilloutmix_NiPrunedFp32Fix.safetensors 采样方法(Sampler)Sampling method&#xff1a;DPM SDE …