news 2026/8/26 17:30:17

数据结构:选择排序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据结构:选择排序

上一篇我们讲了插入排序,这一篇我们来讲选择排序。因为堆排序之前我们有详细讲过,所以这里只给出堆排序的思路,有兴趣的可以看一看。

选择排序

选择排序就是从数组中选出最小值和最大值,最小值放在第一个位置,最大值放在最后一个位置,依次执行,直到排成有序数组为止。

直接选择排序

直接选择排序就是从beginend范围中获取最大值和最小值,将最小值放到begin位置,最大值放到end位置。依次执行直到排成有序数组为止。

思路

比如说我们有以下数组:

我们把数组起始位置作为begin,末尾作为end,从中找出最小值mini和最大值maxi。

我们将最小值mini位置和begin位置数据交换一下,然后将最大值maxi位置和end位置数据交换一下,使得最小值放到begin位置,最大值放到end位置。

然后begin++,end- -,再从beign到end范围中找出最小值mini和最大值maxi。

将mini和begin数据交换,maxi和end数据交换。

然后begin++,end- -,继续从begin到end范围中找最小值和最大值。

此时我们发现maxi在begin位置,如果我们继续直接交换mini和begin,maxi和end就会发生这样一件事。

我们发现最小值没有来到begin位置,最大值也没有到end位置,这是为什么呢?

maxi在begin位置的时候,我们先交换的是begin和mini位置的数据,这会导致maxi被交换到了mini的位置。
因此,当begin == maxi的时候,我们要让maxi = mini,这步的意义是存储begin被交换后maxi当前所处的位置,这样end和maxi交换才不会出错。## 代码实现
综上所述,我们排序的循环条件是begin < end,当end >= begin的时候则说明排序结束了。然后初始情况下begin = 0,end = n - 1;每次找到最小值最大值并放到begin,end位置后,begin++,end–。

接下来我们定义mini和maxi,我们让它们一开始等于begin,然后从begin + 1到end位置遍历一遍找最大值和最小值。

因为我们是先将最小值放到begin处,所以要判断begin == maxi是否成立,如果成立则让maxi = mini,记录交换后最大值的位置。

如果我们是先将最大值放到end处,则需要判断end == mini,成立则让mini = maxi。


然后将mini处数据和begin处交换,maxi处数据和end处交换。

这个代码就写好了。

我们来简单测试一下。

结果符合预期,说明代码没什么问题。

时间复杂度


该算法嵌套了两层循环,外层因为是两边同时查找,循环次数缩短到了 n/2,内层循环总次数也相当于一个公差为 -2 的等差数列之和,总的来说无论什么情况,该算法时间复杂度为 O(n2)。

堆排序

如果有兴趣的可以看看这篇文章,详细内容不再赘述。
数据结构:堆排序
堆排序是利用堆的思想来进行排序的算法,将原数组通过向上/向下调整算法调整成一个大堆,然后堆顶和堆底元素(数组开头和末尾)进行交换,数组大小 size–,再调整前 size 个元素保证成为一个大堆结构,循环往复直到 size == 0,排序结束。

voidSwap(int*x,int*y){inttmp=*x;*x=*y;*y=tmp;}//向下调整算法voidAdjustDown(int*arr,intparent,intn){intchild=parent*2+1;//左孩子while(child<n){if(child+1<n&&arr[child+1]>arr[child])child++;if(arr[parent]<arr[child]){Swap(&arr[parent],&arr[child]);parent=child;child=parent*2+1;}elsebreak;}}//向上调整算法AdjustUp(int*arr,intchild){intparent=(child-1)/2;while(child>0){if(arr[parent]<arr[child]){Swap(&arr[parent],&arr[child]);child=parent;parent=(child-1)/2;}elsebreak;}}//堆排序voidHeapSort(int*arr,intn){//建大堆for(inti=(n-1-1)/2;i--;i>=0){AdjustDown(arr,i,n);}//排序while(n>0){//交换堆顶和堆底元素Swap(&arr[0],&arr[n-1]);n--;AdjustDown(arr,0,n);}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/26 17:30:09

边界消融之后:当AI几乎什么都会,人类还剩什么?

边界消融之后&#xff1a;当AI几乎什么都会&#xff0c;人类还剩什么&#xff1f; 你有没有在深夜想过这个问题——AI已经能写代码、能作诗、能解微积分、能描述失恋的痛苦……它从未吃过一口饭&#xff0c;却能写出米其林三星主厨级别的菜谱。 三年前&#xff0c;我们担心AI会…

作者头像 李华
网站建设 2026/8/26 17:29:46

2026论文AIGC检测避坑指南:AI率居高不下的真实原因与最优解决办法

大量学生使用降AI工具、人工改写之后依旧AIGC率超标&#xff0c;各类降AIGC软件效果参差不齐。想要稳定完成论文AI降重、AI率和重复率双降&#xff0c;必须分清AIGC检测逻辑、选对适配的AIGC去痕工具。本篇以真实痛点为导向&#xff0c;拒绝简单工具罗列&#xff0c;结合实测拆…

作者头像 李华
网站建设 2026/8/26 17:26:35

Java 第k个最小元素(K’th Smallest Element)

目录 【朴素方法】使用排序——时间复杂度为 O(n log(n))&#xff0c;空间复杂度为 O(1) 【预期方法】使用最大堆 - 时间复杂度为 O(n * log(k))&#xff0c;空间复杂度为 O(k) 【替代方案 1】使用快速选择 【替代方案 2】使用计数排序 如果您喜欢此文章&#xff0c;请收藏…

作者头像 李华
网站建设 2026/8/26 17:25:52

毕得医药(688073.SH)深度研究报告

摘要本报告围绕毕得医药&#xff08;688073.SH&#xff09;展开深度分析&#xff0c;从投资要点、公司概况、行业格局、财务表现、核心竞争力、未来增长点及风险提示等维度进行系统梳理。公司聚焦药物分子砌块和科学试剂领域&#xff0c;凭借产品品类丰富、仓储物流高效和客户结…

作者头像 李华
网站建设 2026/8/26 17:22:17

Large Language Models are Highly Aligned with Human Ratings of Emotional Stimuli

文章总结与翻译 一、主要内容 该研究聚焦大型语言模型(LLMs)与人类对情绪刺激评分的一致性,旨在明确LLMs对情绪刺激的解读方式,为其在需情绪智力的场景(如助手、治疗师、教师)应用提供依据。 1. 研究背景 情绪对人类行为和认知影响重大,是心理学研究百年重点,而当前…

作者头像 李华
网站建设 2026/8/26 17:21:44

GTool: Graph Enhanced Tool Planning with Large Language Model

GTool:基于图增强的大语言模型工具规划方法(文章总结与翻译) 一、文章主要内容总结 1. 研究背景与问题 当前大语言模型(LLMs)在自然语言处理任务中表现突出,但在数值计算、复杂问题求解等场景中依赖外部工具(如API、算法)。工具规划作为LLMs与工具交互的核心能力,需…

作者头像 李华