分享好友 最新动态首页 最新动态分类 切换频道
【排序算法】快速排序(四个版本以及两种优化)含动图)
2024-12-26 14:29

制作不易,三连支持一下吧

【排序算法】快速排序(四个版本以及两种优化)含动图)

文章目录

  • 前言
  • 一.快速排序Hoare版本实现
  • 二.快速排序挖坑法版本实现
  • 三.快速排序前后指针版本实现
  • 四.快速排序的非递归版本实现
  • 五.两种优化
  • 总结


前两篇博客介绍了插入和选择排序,这篇博客我们将会介绍一个非常重要的排序算法——快速排序,它的实践价值要大远远于前两种排序。

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。


动图展示如下

这里再简单解释一下

我们一般选取最左或最后边的值作为基准值(key,如果我们选择最左边的值为key,且我们要排成升序序列,那我们就让最右边先走(为了保证相遇位置的值一定比key小,找到比key小的位置停下来,然后左边再走,找到比key大的位置停下来,两者交换,循环上述操作,直至left和right相遇,再将相遇位置的值与key交换,这样就完成了单趟排序。

key位置的元素就排到了合适的位置。 

之后递归左右区间即可。

代码实现

 

挖坑法是在hoare大佬版本的基础上为了好让大家理解而改进的一种思路,因为hoare版本如果以最左边的值做key,则必须要让右边先走,让最右边的值做key,则必须要让左边先走,否则会出现错误。 而如果是挖坑法,则无需关心这个问题。大家自然而然会按正确的方式实现。

动图演示如下: 

通俗一点解释

我们将key位置的值保存下来,将那个位置视为一个坑位,右边先走,找到比key小的值就填到坑位中,坑位就更新到新的位置,左边再找大,再更新坑位的位置,直到left和right相遇,将原来key中的值放到坑位中就完成了单趟排序。

这样我们就避免了考虑哪边先走的问题,因为如果左边为坑,我们自然而然的就会让右边先走

代码实现如下

 

前后指针版本是这三种方法里面最值得推荐的一种,因为它实现出来非常的简单。

动图演示如下

 

 简单解释一下

定义两个指针prev和cur,如果啊a[cur]比key位置的值小,就让prev前进一步,并交换cur和prev位置的值,如果a[cur]比key位置的值大,就只++cur。

最后,prev和cur之间的值就是整个序列中比key位置的值大的值。prev之前的值就是比key位置的值小的值。

代码实现如下: 

 
 
 

之前的三种方法虽然思路略有不同,但本质都是分治递归的思想,这种思想比较容易理解,但是递归深度过深可能会导致栈溢出,因此,我们必须掌握非递归的实现,以适用于所有场景。 

从递归改成非递归的方法一般有两种

  • 直接改成循环——例如:斐波那契数列
  • 借助于栈或队列的结构。

我们这里就是要借助于栈的数据结构。

整体思路就是压栈,每次取出一个区间进行单趟排序,然后再入栈,如果区间不存在或只有一个元素就不再入栈,直至栈为空时,排序就完成了。 

代码实现如下: 

 

 

从分治的角度看,快速排序是一种二叉树结构的排序,有些大佬觉得最后几层占了整个递归次数的百分之八九十,消耗有些大,所以当区间长度小于一定数量(一般是10)时就直接用直接插入排序就好了。

也就是说最小子问题不再是区间不存在或只有一个值了,而是区间长度小于10.

 
 

快速排序在序列有序时,效率是不高的,时间复杂度不再是O(N*logN,而是O(N^2)。

为了尽量避免出现最坏的情况,我们可以采用三数取中的方法,防止key是最大或最小的值。

 

 

以hoare版本为例,加入三数取中后,就是这样: 

 

 


最新文章
白酒电商营销策划方案
电商已经成为了消费者购物的主要方式之一。白酒作为中国文化的重要组成部分,在电商平台上也有着巨大的市场需求。因此,白酒品牌需要制定一套有效的电商营销策划方案,以提升品牌知名度、销售量和用户满意度。白酒品牌需要重视电商平台的品
百度地图关怀版 v1.1.5 官网最新版下载 老年人导航地图app
2021年,工信部启动“互联网应用适老化及无障碍改造专项行动”。很多大大小小的APP,都进行了适老化改造,也就是俗称的老年版。如今,备受期待的改造基本已经完成,而这结果,貌似依旧不太理想。部分开发者特别鸡贼,改来改去,就只是加了
荣科科技涨1.25%,目前股价靠近压力位22.00,谨防压力位处回调,若突破压力位则可能会开启一波上涨行情
12月16日,涨1.25%,成交额9.30亿元,换手率6.53%,总市值139.46亿元。根据AI大模型测算荣科科技后市走势。短期趋势看,该股当前无连续增减仓现象,主力趋势不明显。主力没有控盘。中期趋势方面,上方有一定套牢筹码积压。近期该股有吸筹现
谈谈如何让一个SEO新手“快速成长”
现在SEO技术应用越来越广泛了,不用说,学习seo技术的人也越来越多。对于一个新手要学习要掌握的东西很多,那么如何才能更快的学好呢?其实没有更快学好这样的秘诀,我只能教你如何摆好心态,认真学习,这样你肯定比其他人要学的好学的快。
温州螺丝计算机视觉方案设计实时反馈全+境+到+达
  温州螺丝计算机视觉方案设计实时反馈全+境+到+达——苏州希佑科技有限公司!  提供:  计算机视觉|人工智能检测|人工智能视觉检测|CCD 视觉检测|视觉应用|视觉深度学习|AI人工智能检测|AI人工智能图像处理|AI图像处理|视觉检测|不
谷歌优化实操技巧
在海外市场竞争日趋激烈的今天,特别在的影响下,不少外贸企业的老客户也受到了影响。因此通过线上外贸开发海外客户成了企业的重点。而外贸是诸多推广渠道中效果较好且投入较低的一种方式,那么在网站优化时有哪些技巧呢?下面云程网络为大
绘画与影像的美学共生
  作者:陆颖(浙江师范大学艺术学院讲师)   在电影发展历程中,作为传统视觉艺术形式的绘画与之产生了彼此纠缠的关系,二者如同两条蜿蜒前行的轴线,时而交错、时而并进,在形式创新与内容互动等方面,逐渐消弭了门类艺术的边界,催
苹果手机里的APK格式文件肿么转换成APP
手机下载的文件怎么弄成app  手机下载的文件怎么弄成app,经常玩手机的人对于各项的应用都是需要熟练掌握的,手机上的文件非常多,我们可以随意的进行操作,下面为大家分享手机下载的文件怎么弄成app。  手机下载的文件怎么弄成app1 
谁最“牛”?四款牛津电子词典终极评测
现在的词典机太多了,消费者一般难以选择,但里面如果有牛津或剑桥的词典,会好卖很多。一位售货员告诉记者。情况也确实如此,在小编走访中关村各大卖场商铺时,发现权威辞典成为最有杀伤力的武器。 小编认为,这种情况的出现,与电子词典
阿里巴巴1688开店成本多少?怎么做起来的?
不管在哪个平台上开店,都要事先准备好,尤其是资金方面,毕竟店铺开起来之后,需要用资金的地方还很多,那1688批发网开店要交多少钱?下面来我们就来给大家讲解一下这方面的内容。一、1688批发网开店要交多少钱?阿里诚信通年费为6688元一年
相关文章
推荐文章
发表评论
0评