当前位置: 首页 > news >正文

面试重点---快速排序

快排单趟

快速排序是我们面试中的重点,这个知识点也很抽象,需要我们很好的掌握,而且快速排序的代码也是非常重要,需要我们懂了还不行,必须要手撕代码,学的透彻。

在研究快速排序之前,我们首先看一个动画,先自己看几遍,看能不能看懂它在干什么。

这个动画就是我们快排的总体过程,如果你没有看懂也不用急,我用文字来帮助你理解这个过程。我们定义了一个key,他是6这个数字,然后L和R分别在数组的最左边和最右边,首先让R先走,让R找到比key小的数,第一个找的是5,然后不动,再让L向右移动,找到比key大的数,不动,将L和R交换,再继续移动,直到L和R相遇,相遇之后,与key交换,就达到了下面这幅图的效果。

 仔细观察可以发现,我们的6到达了它应该到达的位置,并且,6的左边都比6小,6的右边都比6大。这是我们快排的单趟过程。

快排的全过程

上面我们研究了快排的单趟,而我们怎么将它的单趟结合起来,让整个数组的顺序都排好呢?下面我们来看一组图,演示一下快排的全过程。

这就是快速排序的全过程,是不是很熟悉,就是我们之前二叉树里面接触的递归,有没有想起来呢?

这就是我们实现快排的过程。

key的选取

首先我们思考一个问题,当我们的数组是有序的,那么,效率会发生什么变化呢?

是不是就像上图一样,我们这个时间复杂度就从N*logN变成了N^2呢?效率瞬间就下降了一个层次,为了避免这样的情况发生,我们思考的解决方案就是将我们选取的k不固定的选在第一个,这样就避免了上图的样子,效率也会蹭蹭往上涨,那么,k 用什么办法选呢?

第一种方法就是随机选取,第二种方法就是取中间值,我个人认为还是第二种科学一点,第二种方法的k值是可控的,科学的,不是随机生成的。 

全部代码见下篇文章。

http://www.lryc.cn/news/408927.html

相关文章:

  • [MIT6.5840]MapReduce
  • 【系统架构设计师】计算机组成与体系结构 ⑯ ( 奇偶校验码 | CRC 循环冗余码 | 海明码 | 模 2 除法 )
  • springboot,service 层统一异常抛出时,throws Exception写在接口上还是实现类上
  • 深度学习高效性网络
  • PyQt ERROR:ModuleNotFoundError: No module named ‘matplotlib‘
  • Flutter Geolocator插件使用指南:获取和监听地理位置
  • 网站基本布局CSS
  • ssm框架整合,异常处理器和拦截器(纯注解开发)
  • 古籍双层PDF制作教程:保姆级古籍数字化教程
  • Git 删除 远端的分支
  • PrgogressBar实现原理分析
  • 【HarmonyOS】HarmonyOS NEXT学习日记:七、页面与组件的生命周期
  • 【iOS】——Block循环引用
  • shell脚本自动化安装启动各种服务
  • Python - 开源库 ReportLab 库合并 CVS 和图像生成 PDF 文档
  • Java编写SIP协议
  • 大型语言模型LLM的核心概念
  • 软件测试---网络基础、HTTP
  • 韩顺平0基础学java——第39天
  • Linux文件恢复
  • 大数据的数据质量有效提升的研究
  • Flink-CDC解析(第47天)
  • 二阶段测试
  • CSP-J模拟赛day1——解析+答案
  • 【PostgreSQL案例】我要查的表没有在执行计划中
  • 《程序猿入职必会(5) · CURD 页面细节规范 》
  • 操作系统面试知识点总结5
  • BigInteger和BigDecimal类
  • 2024最新Uniapp的H5网页版添加谷歌授权验证
  • 学习java第一百四十四天