当前位置: 首页 > 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值是可控的,科学的,不是随机生成的。 

全部代码见下篇文章。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 模块与组件、模块化与组件化的理解
  • 可消费的媒体类型和可生成的媒体类型
  • 数据结构——单链表OJ题(上)
  • 玄机-第一章 应急响应-webshell查杀
  • 数据库之数据表基本操作
  • Prometheus监控ZooKeeper
  • Matlab arrayfun 与 bsxfun——提高编程效率的利器!
  • exuberant ctags 支持 typescript 解析
  • 自动驾驶-机器人-slam-定位面经和面试知识系列05之常考公式推导(02)
  • 什么是埋点?前端如何埋点?
  • 速盾:分享一些防御 DDoS 攻击的措施
  • 爬虫 APP 逆向 ---> 粉笔考研
  • 请你谈谈:spring bean的生命周期 - 阶段5:BeanPostProcessor前置处理-自定义初始化逻辑-BeanPostProcess后置处理
  • Profinet从站转TCP/IP协议转化网关(功能与配置)
  • 使用DuiLib进行UI开发的虚函数解析及控件绑定、响应与消息处理
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 30秒的PHP代码片段(1)数组 - Array
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • C++类的相互关联
  • codis proxy处理流程
  • Date型的使用
  • JavaScript服务器推送技术之 WebSocket
  • js中的正则表达式入门
  • 阿里云Kubernetes容器服务上体验Knative
  • 二维平面内的碰撞检测【一】
  • 记录一下第一次使用npm
  • 软件开发学习的5大技巧,你知道吗?
  • 时间复杂度与空间复杂度分析
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 我是如何设计 Upload 上传组件的
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • elasticsearch-head插件安装
  • 交换综合实验一
  • 昨天1024程序员节,我故意写了个死循环~
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $ git push -u origin master 推送到远程库出错
  • (done) 两个矩阵 “相似” 是什么意思?
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (windows2012共享文件夹和防火墙设置
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (二) 初入MySQL 【数据库管理】
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (十五)使用Nexus创建Maven私服
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)ORM
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .Net中间语言BeforeFieldInit
  • /var/lib/dpkg/lock 锁定问题
  • :如何用SQL脚本保存存储过程返回的结果集
  • @property @synthesize @dynamic 及相关属性作用探究