直接选择排序算法

​​​​​​目录

选择排序

SelectSort直接选择排序

整体思路

图解分析 ​

代码实现

时间复杂度


选择排序

基本思想:

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

  • 直接选择排序是暴力选数值。
  • 堆排序是在堆的结构上选数值。

SelectSort直接选择排序

  • 在元素集合array[i]--array[n-1]中选择关键码最大(小)的数据元素。
  • 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换。
  • 在剩余的array[i]--array[n-2](array[i+1]--array[n-1])集合中,重复上述步骤,直到集合剩余1个元素。
  • 优化:遍历一遍同时选取最小的和最大的值同时放在第一位和最后一位(存在一个坑)

直接选择排序的特性总结:
1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1)
4. 稳定性:不稳定 

整体思路

  • 在元素集合array[i]--array[n-1]中选择关键码最大(小)的数据元素。
  • 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换。
  • 在剩余的array[i]--array[n-2](array[i+1]--array[n-1])集合中,重复上述步骤,直到集合剩余1个元素。
  • 优化:遍历一遍同时选取最小的和最大的值同时放在第一位和最后一位(存在一个坑)
  • 优化:本来是一次选出最小的,优化之后一次选出最小的和最大的。
  • 在a[0]~a[n-1]遍历中选出最大的数和最小的数的下标
  • 最大的数的下标:maxi   最小的数的下标:mini
  • 最大的数的位置的下标:begin = 0
  • 最小的数的位置的下标:end = n-1
  • 选出元素下标和对应位置的下标,的元素交换,不是覆盖❗
  • 重复上诉过程,然后begin-- / end++ 直到它们相遇(begin < end )
  • 注意❗最大值元素的下标maxi可能与最小值的元素的位置begin下标重叠,导致交换完最小值a[begin]和a[mini]交换之后的那个位置的元素不是最大值maxi而是最小值mini
  • ❗注意这里交换的是数值,下标没有交换🆗也就是说交换完之后maxi&mini任然指向原来的位置

图解分析 

 大家可以自己尝试画优化版的选择排序🆗

 2,4,3,2,6,5,1,8,9,10,0

  • 每次遍历的i的范围[begin,end](begin和end是变化的)
  • 最大值元素的下标maxi可能与最小值的元素的位置begin下标重叠
  • ❗注意这里交换的是数值,下标没有交换🆗也就是说交换完之后maxi&mini任然指向原来的位置

 

代码实现

void SelectSort(int* a, int n)
{int begin = 0;int end = n - 1;int maxi = begin;int mini = begin;while (begin < end){//遍历区间在[begin,end]for (int i = begin; i <= end; i++){if (a[i] < a[mini]){mini = i;}if (a[i] > a[maxi]){maxi = i;}//>=/<=不换}Swap(&a[mini], &a[begin]);if (a[maxi] == a[begin]){maxi = mini;}Swap(&a[maxi], &a[end]);begin++;end--;}
}

时间复杂度

时间复杂度:O(N^2)

等差数列 

  • 最后会总结稳定性和各个排序效率比较
  • 数据量不同,各个排序相对效率就是不同,不能确定

🙂感谢大家的阅读,若有错误和不足,欢迎指正。下篇堆排序回顾。

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

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

相关文章

【SV的面向对象 SV的类_2024.01.02】

OOP术语 OOP&#xff1a;object oriented programming Class类&#xff1a;包含变量和子程序的基本构建块 Object对象&#xff1a;类的一个实例 Handle句柄&#xff1a;指向对象的指针 Property属性&#xff1a;存储数据的变量&#xff1b;在V中&#xff0c;可以是wire或reg类…

java-场景题

1、超时关单 delayQueue 延迟队列不支持分布式RocketMQ 延迟投递Redis 设置过期时间监听过期事件定时任务&#xff08;阿里&#xff09; 定时任务搂数据库&#xff08;对数据库有压力&#xff09;超时中心 2、分布分表如何进行分页查询 采用es&#xff0c;由es完成分页查询&…

NOTA-马来酰亚胺,1295584-83-6,可作为过渡金属离子的配体

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;NOTA-马来酰亚胺&#xff0c;NOTA Maleimide &#xff0c;NOTA-Mal&#xff0c;1295584-83-6 一、基本信息 产品简介&#xff1a;NOTA Maleimide, also known as NOTA maleimide, is a novel bifunctional integrat…

【LeetCode每日一题】单调栈 402 移掉k位数字

402. 移掉 K 位数字 给你一个以字符串表示的非负整数 num 和一个整数 k &#xff0c;移除这个数中的 k **位数字&#xff0c;使得剩下的数字最小。请你以字符串形式返回这个最小的数字。 示例 1 &#xff1a; 输入&#xff1a;num "1432219", k 3 输出&#xff…

Sora不懂物理世界,翻车神图全网爆笑!LeCun马斯克DeepMind大佬激辩世界模型

大火的Sora&#xff0c;让许多动画、影视行业的人大为恐慌。 不过&#xff0c;今天网上广为流传的这张图&#xff0c;让大家倒是放心了不少。 可以看到&#xff0c;在这个视频中&#xff0c;玻璃杯碎裂的方式十分诡异—— 它被抬到半空中时&#xff0c;桌子上就忽然出现了一滩…

PWM功能介绍 和配置

泰山派默认提供了3组PWM的GPIO &#xff0c; 为了检测PWM的输出&#xff0c;我们可以配合逻辑分析仪来查看效果&#xff0c;或者搭配STC8的LED灯 PWM 测试 列举所有的PWM设备&#xff1a; # 查找所有有pwm名称的文件 find / -name "pwm" # pwm4: pwmfe6e0000 edp屏幕…

Vue2:Vuex中使用mapMutations和mapActions

一、情景说明 上一节&#xff0c;我们学会在vc的computed模块中&#xff0c;使用mapState和mapGetters来简化代码 这一节&#xff0c;我们学习在vc的methods模块中&#xff0c;使用mapMutations和mapActions来简化代码 在vc的methods中&#xff0c;我们会使用到store的dispat…

控制与状态机算法

控制与状态机算法是计算机科学、电子工程和自动化领域中常用的一种设计工具,它用来描述一个系统的行为,该系统在不同时间点可以处于不同的状态,并且其行为取决于当前状态以及输入的信号或事件。状态机算法的核心概念包括: 状态(State):系统的任何可能配置。每个状态代表…

【图像分割 2023 WACV】HiFormer

【图像分割 2023 WACV】HiFormer 论文题目&#xff1a;HiFormer: Hierarchical Multi-scale Representations Using Transformers for Medical Image Segmentation 中文题目&#xff1a;HiFormer:基于Transformer的分层多尺度表示医学图像分割 论文链接&#xff1a; 论文代码&a…

解决updatexml和extractvalue查询显示不全

报错注入是一种常见的SQL 注入方式&#xff0c;通过注入代码&#xff0c;触发数据库的错误响应&#xff0c;并从错误信息中获取有用的信息。 updatexml和extractvalue updatexml和extractvalue 是常用的两个报错注入函数 http://localhost/sqli/Less-5/?id1%27and%20updat…

【使用QT遇到的小问题】

使用QT遇到的小问题 error: cannot open output file debug_0219homework.exe: Permission denied 应该是由于没关多次ctrl r 运行项目导致的&#xff0c;解决办法&#xff0c;把项目关了&#xff0c;重新开下。 0.0醉了。

Maxwell - 增量数据

前言 今天来学习一个新的大数据小工具 Maxwell &#xff0c;它和 Sqoop 很像。Sqoop主要用于在 Hadoop &#xff08;比如 HDFS、Hive、HBase 等&#xff09;和关系型数据库之间进行数据的批量导入和导出&#xff0c;而 Maxwell 则主要用于监控数据库的变化&#xff08;通过监控…

如何使用Docker部署Drupal并结合cpolar实现固定公网地址访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…

table表格/内容等左右滑动禁止mac笔记本等自带左右滑返回功能

.el-table__body-wrapper {overscroll-behavior: contain;/* 防止滚动过头效果 */ }overscroll-behavior CSS 属性是 overscroll-behavior-x 和 overscroll-behavior-y 属性的合并写法, 让你可以控制浏览器过度滚动时的表现——也就是滚动到边界。 auto - 默认。元素的滚动会传…

2024年及以后在您的项目中使用的最佳CSS框架

在过去几年中&#xff0c;CSS已经取得了长足的进步。在过去&#xff0c;您可能会使用CSS来创建依赖于HTML表格和CSS浮动作为其布局系统的简单外观的Web应用程序。而现在&#xff0c;您可以设计复杂的交互式用户界面&#xff0c;具有优雅的设计。 尽管CSS变得越来越先进&#x…

虚拟机centos7 网络IP冲突

修改其中一个虚拟机IP 1&#xff1a; 设置虚拟机网络配置器的模式为NAT模式&#xff0c;操作方式如下图所示 2&#xff1a;点击虚拟网络编辑器 3&#xff1a;点击NAT设置 4&#xff1a;点击DHCP配置 5&#xff1a; 修改配置文件来指定IP并可以连接到外网&#xff0c;在roo…

Oracle12cR2之EXP与IMP命令行工具多种使用方式

Oracle12cR2之EXP与IMP命令行工具多种使用方式 文章目录 Oracle12cR2之EXP与IMP命令行工具多种使用方式1. EXP命令行导出dump文件1. 完全模式2. 用户模式3. 表模式 2. 使用IMP命令行导入dump文件1. 与EXP导出对应的三种导入方式2. 使用参数文件方式导入dump文件 在Oracle数据库…

linux系统监控工具的补充内容

监控补充 注意在配置电话告警时候&#xff0c;出现创建新报警媒介类型失败zabbix的默认端口zabbix自定义键值报错 注意 模板导入不要勾选主机&#xff0c;因为主机ip与之前不同监听端口用的是tcp协议监控项是键值分为有变量和无变量报警信息自定义信息优先级比报警媒介模版优先…

【通讯录案例-数据存储总结 Objective-C语言】

一、我们简单的把“数据存储”总结一下, 1.上午,我们说的三种存储方式, 1)plist 2)Preference(偏好设置) 3)NSKeyedArchiver(归档、解档) 三种存储方式, 2.什么能做plist存储, 1)writeToFile:方法, 实际上,这个东西,才是关键, 有一个对象,可以去写w…

ETL数据集成工具DataX、Kettle、ETLCloud特点对比

ETL数据集成工具 对于数据仓库&#xff0c;大数据集成类应用&#xff0c;通常会采用ETL工具辅助完成。ETL&#xff0c;是英文 Extract-Transform-Load 的缩写&#xff0c;用来描述将数据从来源端经过抽取(extract) 、交互转换(transform) 、加载(load)至的端的过程当前的很多应…