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

解释:就是不断的找到最小的放在最左面,然后缩短数组,继续找最小的放在最左面,最后就是一个升序数组。
二:代码
单向选择排序:
void SelectSort(int* a, int n)
{// 初始化begin为数组的第一个元素int begin = 0;// 当begin小于n-1时循环,即只要不是数组的最后一个元素,就继续排序while (begin < n - 1){// 假设当前begin位置的元素是最小的int mini = begin;// 从begin+1到数组最后一个元素之间查找真正的最小元素for (int i = begin + 1; i <= n - 1; i++){// 如果找到一个比当前假设的最小元素还要小的元素,更新mini的值if (a[i] < a[mini]){mini = i;}}// 将找到的最小元素与begin位置的元素交换Swap(&a[mini], &a[begin]);// 交换完成后,begin位置的元素已经是正确的元素,将begin向后移动一位begin++;}
}
解释:
1:n是元素的个数,n-1是元素下标的最大值,begin<n-1即代表begin最大能取到n-2,此时数组还剩2个元素,是最后一次查找,再往下一个数字不用查找了,所以begin < n - 1

2:缩短数组就是代码中的begin++,找到最小并且交换之后,begin向后移动一位,进入新一轮的查找
双向选择排序:
void SelectSort2(int* a, int n)
{// 初始化begin为数组的起始位置,end为数组的末尾位置int begin = 0;int end = n - 1;// 当begin小于end时,表示数组中还有元素未排序while (begin < end){// 初始化最小元素和最大元素的索引为beginint mini = begin;int maxi = begin;// 从begin+1到end遍历数组,寻找当前未排序部分的最小和最大元素for (int i = begin + 1; i <= end; i++){// 如果当前元素大于已知最大元素的值,更新最大元素的索引if (a[i] > a[maxi]){maxi = i;}// 如果当前元素小于已知最小元素的值,更新最小元素的索引if (a[i] < a[mini]){mini = i;}}// 将找到的最小元素交换到begin位置Swap(&a[mini], &a[begin]);// 如果最大元素的索引刚好是begin(此时begin位置的元素已经被最小元素替换了)// 那么需要更新最大元素的索引为mini(因为最小元素已经被交换到begin位置)if (maxi == begin){maxi = mini;}// 将找到的最大元素交换到end位置Swap(&a[maxi], &a[end]);// 缩小未排序部分的范围,end向左移动一位,begin向右移动一位end--;begin++;}
}
解释:
1:和第一种相比区别在于,它每次遍历数组的时候,不仅找最小,还要找最大,然后再通过交换,每次的遍历能确定两个元素的位置
2:在交换时,我们第一步Swap(&a[mini], &a[begin]);将找到的最小元素交换到begin位置,但是如果最大元素的索引刚好是begin(此时begin位置的元素已经被最小元素替换了),那么需要更新最大元素的索引为mini(因为最小元素已经被交换到begin位置),再将找到的最大元素交换到end位置才是正确的交换。
图示如下:

三:代码运行结果
对同一个十万个整形的数组进行选择排序

可以看出:两者相差不大,毕竟都是同一个量级的时间复杂度。
四:复杂度讲解
时间复杂度:
选择排序的时间复杂度在最好、最坏和平均情况下都是O(n^2)
解释:
- 第一轮需要比较n-1次(对于n个元素的数组)。
- 第二轮需要比较n-2次。
- …
- 最后一轮需要比较1次。 因此,总的比较次数是 (n-1) + (n-2) + … + 1 = n(n-1)/2,大O表示为O(n^2)。
空间复杂度
选择排序的空间复杂度是O(1)。
选择排序是在原地进行排序的,不需要额外的存储空间来存储数据。
五:两种选择排序的对比
单向选择排序和双向选择排序的时间复杂度在理论上是相同的,都是O(n^2)。这是因为两种排序算法都需要遍历整个未排序的部分来找到最小(或最大)的元素,并且在每一轮排序中,都需要进行一定数量的比较。
具体来说:
-
单向选择排序:在每一轮排序中,算法会找到未排序部分的最小(或最大)元素,并将其放到已排序部分的末尾。每轮排序需要进行n-i次比较,其中i是当前轮次的索引(从0开始)。因此,总的比较次数是 (n-1) + (n-2) + … + 1 = n(n-1)/2,这是O(n^2)的时间复杂度。
-
双向选择排序:在每一轮排序中,算法会同时找到未排序部分的最小和最大元素,并将它们分别放到已排序部分的末尾和开始。尽管每一轮可以处理两个元素,但每轮排序仍然需要遍历整个未排序的部分,因此每轮排序的比较次数与单向选择排序相似。总的比较次数同样是O(n^2)。
虽然双向选择排序在每一轮可以减少交换次数(可能只需要两次交换,而单向选择排序可能需要一次),但是比较次数并没有减少。因此,两种算法在时间复杂度上是等价的。
需要注意的是,尽管时间复杂度相同,双向选择排序在实际执行中可能会有更好的性能,因为它减少了交换次数,而交换操作通常比比较操作更耗时。然而,这种性能提升通常不足以改变算法的时间复杂度类别。
六:代码分享
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<assert.h>
void PrintArray(int* a, int n)
{for (int i = 0; i < n; i++){printf("%d ", a[i]);}printf("\n");
}
void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}
void SelectSort(int* a, int n)
{// 初始化begin为数组的第一个元素int begin = 0;// 当begin小于n-1时循环,即只要不是数组的最后一个元素,就继续排序while (begin < n - 1){// 假设当前begin位置的元素是最小的int mini = begin;// 从begin+1到数组最后一个元素之间查找真正的最小元素for (int i = begin + 1; i <= n - 1; i++){// 如果找到一个比当前假设的最小元素还要小的元素,更新mini的值if (a[i] < a[mini]){mini = i;}}// 将找到的最小元素与begin位置的元素交换Swap(&a[mini], &a[begin]);// 交换完成后,begin位置的元素已经是正确的元素,将begin向后移动一位begin++;}
}
void SelectSort2(int* a, int n)
{// 初始化begin为数组的起始位置,end为数组的末尾位置int begin = 0;int end = n - 1;// 当begin小于end时,表示数组中还有元素未排序while (begin < end){// 初始化最小元素和最大元素的索引为beginint mini = begin;int maxi = begin;// 从begin+1到end遍历数组,寻找当前未排序部分的最小和最大元素for (int i = begin + 1; i <= end; i++){// 如果当前元素大于已知最大元素的值,更新最大元素的索引if (a[i] > a[maxi]){maxi = i;}// 如果当前元素小于已知最小元素的值,更新最小元素的索引if (a[i] < a[mini]){mini = i;}}// 将找到的最小元素交换到begin位置Swap(&a[mini], &a[begin]);// 如果最大元素的索引刚好是begin(此时begin位置的元素已经被最小元素替换了)// 那么需要更新最大元素的索引为mini(因为最小元素已经被交换到begin位置)if (maxi == begin){maxi = mini;}// 将找到的最大元素交换到end位置Swap(&a[maxi], &a[end]);// 缩小未排序部分的范围,end向左移动一位,begin向右移动一位end--;begin++;}
}
void TestOP()
{//生成N个随机数srand(time(0));int N = 100000;int* a1 = (int*)malloc(sizeof(int) * N);int* a2 = (int*)malloc(sizeof(int) * N);assert(a1);assert(a2);for (int i = 0; i < N - 1; i++){a1[i] = rand();a2[i] = a1[i];}//clock函数计算排序函数运行的时间int begin1 = clock();SelectSort(a1, N);int end1 = clock();//clock函数计算排序函数运行的时间int begin2 = clock();SelectSort2(a2, N);int end2 = clock();printf("SelectSort:%d\n", end1 - begin1);printf("SelectSort2:%d\n", end2 - begin2);//释放空间free(a1);//释放空间free(a2);}
int main()
{//单向选择排序TestOP();return 0;
}
相关文章:
选择排序
一:基本思想 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。 解释:就是不断的找到最小的放在最左面,然后缩短数组,…...
SQL数据库(MySQL)
一、在Ubuntu系统下安装MySQL数据库 1、更新软件源,在确保ubuntu系统能正常上网的情况下执行以下命令 sudo apt-get update 2、安装MySQL数据库及相关软件包 # 安装过程中设置root用户的密码 123456 sudo apt-get install mysql-server # 安装访问数据库的客…...
在MindSearch中使用SiliconCloud:全面指南**
随着硅基流动(SiliconFlow)提供的InternLM2.5-7B-Chat服务的免费开放,我们迎来了MindSearch部署的全新篇章。这一服务的免费提供,不仅极大地降低了部署门槛,还为MindSearch的使用者带来了纯CPU版本的便利。本文将为您详…...
C++(2)之Linux多线程服务端编程总结
C之Linux多线程服务端编程读书笔记 Author: Once Day Date: 2023年1月31日/2024年8月23日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: Linux实践…...
【AI视频】复刻抖音爆款AI数字人作品初体验
博客主页: [小ᶻZ࿆] 本文专栏: AI视频 | AI数字人 文章目录 💯前言💯抖音上的爆火AI数字人视频💯注册HeyGen账号💯复刻抖音爆款AI数字人💯最终生成效果💯小结 对比原视频效果:…...
Mysql 面试题总结
1. Mysql 数据库,隔离级别有哪几个? 在 MySQL 数据库中,事务的隔离级别决定了一个事务在执行期间对其他事务可见的数据变化情况。MySQL 支持 SQL 标准定义的四种隔离级别,从低到高依次为: 读未提交(READ U…...
stack - queue
1.容器适配器 (1) 什么是适配器? 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口 (2) STL标准库中stack和queue的底层结构 虽然stack和…...
微软九月补丁星期二发现了 79 个漏洞
微软将在2024 年 9 月补丁星期二修复 79 个漏洞。 微软有证据表明,发布的四个漏洞被野外利用和/或公开披露;所有四个漏洞均已在CISA KEV上列出。微软还在修补四个关键的远程代码执行 (RCE) 漏洞。 不同寻常的是,微软本月尚未修补任何浏览器…...
研1日记12
1. 改19->10 2. 学习数据不平衡问题 1. 欠采样 合并两个样本数据 两种方式 1. 按原分布比例划分。sklearn中train_test_split里,参数stratify含义解析_traintestsplit参数stratify-CSDN博客 3.刘二大人 卷积操作 待看论文: 刘老师指导:…...
Rocky Linux 9安装mysqlclient库报错的解决方法
环境 VMware Rocky Linux 9.4 MySQL 8.0 安装mysqlclient报错 yum install python3-devel pip3 install mysqlclient报错: Downloading http://mirrors.aliyun.com/pypi/packages/37/fb/d9a8f763c84f1e789c027af0ffc7dbf94c9a38db961484f253f0552cbb47/mysqlcli…...
Spring Boot母婴商城:安全、便捷、高效
2 相关技术 2.1 SSM框架介绍 本课题程序开发使用到的框架技术,英文名称缩写是SSM,在JavaWeb开发中使用的流行框架有SSH、SSM、SpringMVC等,作为一个课题程序采用SSH框架也可以,SSM框架也可以,SpringMVC也可以。SSH框架…...
php实现kafka
kafka类: <?phpclass b2c_kafka {public $broker_list;public $topic;public $group_id;protected $producer null;protected $consumer null;protected $receive_wait_time;protected $receive_wait_num;/*** 构造方法* param object app*/public function …...
YOLOv10改进系列,YOLOv10损失函数更换为Powerful-IoU(2024年最新IOU),助力高效涨点
改进前训练结果: 改进后的结果: 摘要 边界框回归(BBR)是目标检测中的核心任务之一,BBR损失函数显著影响其性能。然而,观察到现有基于IoU的损失函数存在不合理的惩罚因子,导致回归过程中锚框扩展,并显著减缓收敛速度。为了解决这个问题,深入分析了锚框扩展的原因。针…...
工具知识 | Linux 常用命令参考手册
目录 文件 查看文件内容 headtailcatnlmore 创建 touchmkdirmktemp 删除 rmrmdir 查找文件 findlocate lspwdwcchattrpastestatgrepsedcdcpmvopensourcetreelnfilesortuniqsplitvim 系统管理 nohupwatchpingwhichshutdownrebootuptimecrontabatunameifconfigwhereischmodlsofc…...
mysql 常用知识点总结
MySQL 是一种广泛使用的关系型数据库管理系统(RDBMS),它基于结构化查询语言(SQL)。了解 MySQL 的语法对数据库管理和操作非常重要。以下是 MySQL 语法的详细完整解释,涵盖基本概念、创建表、查询、修改数据…...
conda常用指令
1、查看conda版本 conda --version 2、更新conda conda update conda 3、查看conda环境信息 conda info 4、查看已有虚拟环境 conda info --envs conda info -e conda env list 5、创建新虚拟环境 conda create --name myenv python3.8 6、激活环境和退出环境 conda…...
前后端分离项目--下载功能
文章目录 不使用代理服务器blobblob构造函数通过FormData对象的getBlob方法创建Blob对象将Blob对象转换成UR 使用代理服务器 前后端分离项目中下载与其他接口的使用不同,一般下载不走node,不通过代理服务器,而是直接在前台发送请求࿰…...
PMP--一模--解题--81-90
文章目录 4.整合管理81、 [单选] 一位先前不活跃的干系人参与程度突然增加,这种意外的参与导致了一些变更请求。项目经理应该做什么? 4.整合管理82、 [单选] 公司的新产品系列将在两个月内发布,95%的项目任务均已完成。但是,管理层…...
计算机网络 --- 【2】计算机网络的组成、功能
目录 一、计算机网络的组成 1.1 从组成部分看 1.2 从工作方式看 1.3 从逻辑功能看 1.4 总结 二、计算机网络的功能 2.1 数据通信 2.2 资源共享编辑 2.3 分布式处理 2.4 提高可靠性 2.5 负载均衡 一、计算机网络的组成 1.1 从组成部分看 我们举例分析计算机网络从…...
『功能项目』切换职业技能面板【49】
我们打开上一篇48切换职业面板的项目, 本章要做的事情是制作第二职业法师技能面板、第三职业面板并且完成切换 双击打开Canvas进入预制体空间 复制三个技能栏面板 重命名 设置第一技能栏 设置第二职业技能栏 设置第三职业技能栏 修改脚本:ChangeProfess…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
