分享好友 最新动态首页 最新动态分类 切换频道
排序【选择排序和快速排序】
2024-12-25 16:29

每次选出最小(或最大)的一个元素,存放在数组的起始位置,直到所有元素都排完。

  • 在数组中选出最大(小)的元素。
  • 若该元素不是数组的最好一个(第一个)元素,那么就与数组中的最后一个(第一个)元素进行交换。
  • 然后在剩余的或者的数组中重复上述步骤,直到只剩下一个元素。

注意:本文讲解的是已经优化过一遍的版本(一次选出最大和最小)。
我们先设立好区间,使用begin作为遍历的起点,end为终点;由于begin和end是区间,所以我们在遍历的时候不能改变他们的值,所以我们再建立两个变量(mini和maxi)用来存放最大和最小元素的下标。

 

然后再进行交换,最小的元素和第一个元素交换,最大的元素和最后一个元素交换。

但是,有一个特殊情况:当首元素(下标为begin的元素)是最大的元素的时候。

解决方法:由于我先交换了最小的元素,所以这时最大的元素就在mini下标处,那我在进行最大元素的交换前,先判断maxi是否等于begin,如果等于,我就将mini赋给maxi由于mini和maxi存放的都是下标,所以在交换前并不会影响数组的原本顺序

 

最后从单次排序转换成多次排序(改变区间的值

 
 

尽管是优化了,但效率依旧不高。

  1. 直接插入的排序很好理解,但是效率不高,基本没用使用的价值
  2. 时间复杂度:
  3. 空间复杂度:
  4. 稳定性:不稳定

堆排序也是选择排序的一种,但是效率很高,由于堆排序在前文已经讲解过了,在本文就不讲解了(链接:堆排序)。

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序

所谓交换,就算根据序列中两个记录键值的比较结果来交换这两个记录在序列中的位置。
交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。

任取待排序序列中的某个元素为基准值,按照该排序码将待排序集合分割成两个子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后左右子序重复上的过程(找基准值->分割,直到所有元素都排列在相应的位置上。

主体框架为

 

我们从框架可以发现,这与二叉树的前序遍历的规则非常相似,所以我们根据前序遍历可以很快的写出框架,后续只需要分析如何按照基准值来对区间内的数据进行划分即可。

2.3.1 Hoare版本

具体情况如下
先让right走遇到比基准值小的停下来,然后让left走遇到比基准值大的停下来,当他们停下来后,将他们两个所对应的元素进行交换,重复此操作,直到他们两个相遇,相遇之后将基准值与相遇位置所对应的元素进行交换。

他们相遇位置的元素一定是基准值,所以不需要判断基准值与相遇元素的大小

 
 
关于元素一定基准值的证明

他们相遇只有两种情况,left 遇到 right,或者 right 遇到 left
这里的遇到指的是移动的一方 遇到 静止的一方

  1. 情况一:right不动,left遇到right,前面我们说了,我们会先让right先走,right不动了,就代表此时right位置所对应元素一定是小于基准值的,然后left遇到了right那么就代表left走过的区域已经没有比基准值大的元素了而后面已经被right走过或者交换过了,那么相遇位置之前的元素就都小于基准值了。
  2. 情况二:right一直走到left的位置,那么这时就有两种情况,left没有移动过和left移动过
    left没有移动的话,那么他所在的值是基准值本身,这时就相遇元素等于基准值
    left移动过的话,由于是right先移动,那么他们必定发生了交换,且left位置的值一定是交换过后的值,这就相遇元素就一定小于基准值。

2.3.2 挖坑法

随着快排的不断发展,人们优化了Hoare方法,用挖坑法,虽然这种方法没有效率的提升,但提高了代码的可读性,也不要纠结相遇元素与基准值的大小关系。

 
 

2.3.3 前后指针法

快速排序还有另一种方法,也是可读性最好的,我们可以定义两个指针,prev一个指向开头,cur指向prev的下一个数,然后让cur一直向前走,直到找比key小的数,然后让prev走一步并进行交换,然后继续让cur找比key小的值(遇到大于key的就++cur,重复以上操作,直到cur越界,当cur越界的时候,将key与prev指向的元素进行交换。
具体如图

 
 

这个优化和上面的挖坑法、前后指针是不一样的,上述两种方法是优化了代码可读性和简化了思想复杂性,他们的效率都是一样的。
而这个优化的是快排的性能。

也就是说,由于每次排序,key值都是整个数组中最小的数,因此,每次分割都会分割出一个只有key的左区间和剩余元素的右区间。但由于内存中的栈空间无法同时容纳十万个函数,所以会出现栈溢出。

解决方法(三数取中:先提取出数组的开头元素、结尾元素、中间元素,然后在他们三个中选择中间值,这样就能解决快排在有序情况下的栈溢出的问题,同时也能提升快排的效率

2.4.1 三数取中

 

放入快排

 
 

2.4.2 小区间优化

小区间优化,就是当这个区间的大小到达一定程度时,直接用插入排序。

 

放入快排

而快速排序我们讲解了Hoare版本,挖坑法和前后指针法,这三个方法并没有效率的差别,还讲解快排在有序情况下的优化(三数取中,和小区间优化。
其中小区间优化用到了直接插入排序,这个在前文也有讲到(链接:排序【插入排序】)。

最新文章
大力提振什么消费?何为首发经济?
来源:格隆汇最近的zzj工作会议和中央经济工作会议都提到了“大力提振消费,提高投资效益,全方面扩大国内需求”,12号的中央经济工资会议通稿更是把“大力提振消费、提高投资效益,全方位扩大国内需求。实施提振消费专项行动,推动中低收
山东东方男科医院→网上预约挂号→流程
@所有男同志我院泌尿男科门诊挂号可通过微信公众号(山东东方男科医院)进行线上预约 手机上点一点就能在线完成门诊预约挂号啦~山东东方男科医院·在线门诊预约点击下方公众号名片或直接在微信搜索“山东东方男科医院”公众号。关注公众号
用AI技术一键生成超逼真美女写真,探索最新AI绘画工具的魅力!
限时免费,点击体验最近超火的AI生图神器,坐拥3000美女的大男主就是你! https://ai.sohu.com/pc/generate/textToImg?_trans_=030001_yljdaimn 在这个数字化飞速发展的时代,AI绘画技术如雨后春笋般涌现,尤其是在美女写真生成方面,已经
西吉:50万头肉牛撑起壮阔产业
  金秋的葫芦河畔山川锦绣、牛羊成群,四处呈现着收获的景象。位于六盘山西麓的西吉县,山高气爽、土肥草丰,是宁夏最大的肉牛养殖区。高原生态、绿水青山,孕育出千山牧草、万户养牛的壮阔产业。  近年来,西吉县对标自治区“六特”产
怎么能免费制作自己的微信小程序?
 看下方,小程序的制作有以下四种主要方式: 免费小程序(这里分为三种小程序类型,1.个人小程序2.个体小程序3.企业小程序) [一般个人小程序的话不建议申请,因为权限接口很多,根本没啥用&#x
神马seo排名优化流程技巧
2. 内容优化在确定了关键词之后,需要对网站内容进行优化。网站内容应该包含与关键词相关的信息,并且应该是高质量的、有用的和易于阅读的。此外,应该确保网站内容的结构良好,并且应该避免使用重复内容或者过度堆砌关键词的做法。3. 网站
爱拍视频剪辑app
爱拍游戏app是一款非常不错的原创游戏视频分享手机软件,应用功能齐全,内涵丰富,以游戏视频分享为主,然而,也有类似于动漫、微电影等其他的原创视频分享.同时,爱拍app还提供视频点播、直播以及互动等全方位服务,快来点击下载体验一下吧!爱拍
谷歌广告代理:谷歌推广包年怎么样?谷歌代理商包年推广大揭秘!
写在前面:其实,做包年的谷歌推广“代理商”,压根就不算是谷歌正规代理商。谷歌代理:谷歌推广有官方后台,在后台里,你可以自由设置广告、关键字,广告语,投放时间段、国家地区等,当然,你的广告花费也一目了然。警惕谷歌推广包年:明
苹果手机死机了怎么办 如何解决手机卡屏问题 ?
苹果手机之所以受到多数人的追捧,并不是全部因为它是一款土豪级,代表的是面子,更多的是因为它的性能确实好,比起其他手机的运行速度快切换刷机速度快,虽然使用寿命比其他手机好,但是还是存在一些问题,苹果手机同样会死机或卡屏,遇上
荆州屋顶漏水维修电话〈免费上门〉荆州屋顶防水补漏师傅
不砸砖、不砸墙;免砸砖防水补漏技术,2小时快速解决漏水问题,超长保修期。漏水维修服务项目:楼顶漏水、卫生间漏水、洗浴间漏水、楼顶裂缝漏水、玻璃房漏水、飘窗防水、阳台漏水、洗手间墙面起皮、厨房漏水、外墙渗水、建筑防水、泳池渗水、
相关文章
推荐文章
发表评论
0评