快速排序详解

2023-11-05

近些天来,由于需要找工作,特将数据机构与算法中的快速排序温习总结了一下,希望对于大家学习有所帮助。

首先,快速排序的基本思想是基于分治的思想,是冒泡排序的改进型。首先在数组中选择一个基准点(该基准点的选取可能影响快速排序的效率,后面讲解选取的方法),然后分别从数组的两端扫描数组,设两个指示标志(low指向起始位置,high指向末尾),首先从后半部分开始,如果发现有元素比该基准点的值小,就交换low和high位置的值,然后从前半部分开始扫秒,发现有元素大于基准点的值,就交换low和high位置的值,如此往复循环,直到low>=high,然后把基准点的值放到high这个位置。一次排序就完成了。以后采用递归的方式分别对前半部分和后半部分排序,当前半部分和后半部分均有序时该数组就自然有序了。

在快速排序算法中,最主要的就是基准元素的选取和元素的移动。

基准元素的选取最简单的就是选取数列中的第一个元素。但是对于这种情况下,如果选取的基准元素是数列的最大值个最小值,就会使得分治法无法发挥作用,使得快排得得时间复杂度倒退至0(N^2)。在选择基准元素的时候可以不选择数列的第一个元素,而随机选择一个元素作为基准元素。这样的话会使得,数列在完全逆序的情况下,也可以有效的将数列分为两部分。但是随机选择记基准元素也不能完全的避免上面所说的情况。

第二个主要的问题就是元素的移动情况。对于这个元素的移动,可以实现的方法有两种,第一种是挖坑发,第二种就是指针交换法。

对于挖坑法,对于一个给定的原始数列,要求从大到小的排序,首选我们选择一个基准元素Pivot,并记住这个Index,对于这样位置的就相当于是一个坑,并且设置有两个指针left和right。如下图所示:

在接下来,从right指针开始,把指针指向的元素和基准元素作比较,如果比基准元素大的话,则right指针向左移动,若比基准元素小的话,则将right指向的元素填入这个坑中。在这个例子中将1作为元素填入坑中,这样的话元素1原来所在的位置就成为了新的坑。这样的话,left向右移动一位。注意看此时的index在1所在的位置。此时left左边的区域就代表着比基准元素小的区域。

然后比较left指针指向的位置是7大于基准元素4,于是将7本来的位置成为了新的坑,并将right向左移动一位。此时的index在7原来的位置。

此时right右边的位置都是比基准元素大的区域。

right指向的元素8>4,于是right继续左移。

 此时right指向了2,2<4,于是用2来填坑,就是将2放到了index指向的位置,更新之后的index指向了2所在的位置,left向右移动,切换到left。

left指向的元素是6>4,于是将6来填坑,放到了index指向的位置,并且将right向左移动。index指向6原先所在的位置。

right指向的元素3<4,于是用3来填坑,并且left向右移动一位,index更新到3原先在的位置。

left指向的位置5>4,于是用5来填坑,index指向了5所在的位置,right向左移动。

此时的right和left重合,这时候就将基准元素4放到了index所指向的位置,这时候排序基本完成。4左边的都是小于4的元素,右边的都是大于4的元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速排序详解 的相关文章

  • 微信小程序新规,规范用户隐私保护指引

    背景 新功能发版突然遇到弹窗提示 需要更新用户隐私保护指引的设置 否则无法发布新版本 这里吐槽一下 在此之前微信小程序后台消息并未收到相关通知 解决路径如下 入口有两处 第一处如图 第二处入口 发布版本时会有提示 直接拦截 让完善协议 如图
  • java中的<;和>;分别是什么意思

    今天在做java笔试题的时候 有一题出现了这个符号 由于我不认识这个符号就做错了 题目如下 这题的答案是A 而我选了C 后面百度才知道 lt 的意思是小于 lt 符号 在用markdown写文章的时候 就会显示 笔者在这里贴出其他类似的符号
  • C#异步编程学习笔记4 之 异步函数

    C 异步编程学习笔记4 之 异步函数 异步函数 awaiting async 修饰符 异步方法如何执行 可以 await 什么 捕获本地状态 await 之后在哪个线程上执行 UI 上的 await 代码运行原理 与粗粒度的并发相比 编写异

随机推荐

  • Blender插件BoxCutter 7.1.7v15 硬表面建模2.91+教程Box Cutter

    Boxcutter旨在成为最快的屏幕3d视图绘图切割器 通过时间和经验来学习和增强了工具 以使工作流程尽可能地人性化地优化用户 提供各种行为来个性化体验 以使事情保持流畅 每天都会对这些工具进行严格的测试 以确保它们不仅可以与当前版本的Bl
  • Flask-文件上传

    在Flask中处理文件上传非常简单 它需要一个enctype属性设置为 multipart form data 的HTML表单 将该文件提交到指定URL 也可以配置上传文件路径和指定上传文件大小 实例 upload html文件中包含一个f
  • 征战开发板从无到有(三)

    接上一篇 翘首已盼的PCB板子做好了 管脚约束信息都在PCB板上体现出来了 很满意 会不会成为爆款呢 嘿嘿 来 先看看PCB裸板美图 由于征战开发板电路功能兼容小梅哥ACX720 大家可以直接用小梅哥的视频来学习 不会影响学习体验 现在学习
  • C语言最重要的知识点【入门干货】

    C语言最重要的知识点 总体上必须清楚的 1 程序结构是三种 顺序结构 选择结构 分支结构 循环结构 2 读程序都要从main 入口 然后从最上面顺序往下读 碰到循环做循环 碰到选择做选择 有且只有一个main函数 3 计算机的数据在电脑中保
  • RuntimeError: cublas runtime error : resource allocation failed at

    root bsyocr server train tail trainall210722 6 log txt File home server train pytorch pretrained modeling py line 300 in
  • Nginx的安装(实践记录)

    1 安装nginx需要系统中有gcc环境 先查看本机是否安装gcc gcc version 如果没有就需要安装 gcc gcc c gcc g gcc gnat gcc java gcc objc libgcj libgcj devel l
  • C/C++ 杨辉三角形

    题目描述 还记得中学时候学过的杨辉三角形吗 具体的定义这里不再描述 你可以参考以下的图形 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 输入 输入数据包含多个测试实例 每个测试实例的输入只包含一个正整数n 1 lt n lt
  • AJAX学习笔记8 跨域问题及解决方案

    AJAX学习笔记7 AJAX实现省市联动 biubiubiu0706的博客 CSDN博客 跨域 指一个域名的网页去请求另外一个域名资源 比如百度页面去请求京东页面资源 同源与不同源三要素 协议 域名 端口 协议一致 域名一致 端口一致 才算
  • JAVA中的内存分配

    JAVA中的内存分配 栈 方法运行时使用的内存 比如main方法的运行 进入方法栈中执行 堆 存储对象或数组 new来创建的 都存储在堆内存中 方法区 存储可以运行的class文件 本地方法栈 JVM在使用操作系统功能的时候使用 和我们开发
  • 查询、关闭正在运行的Tomcat端口

    查询正在使用的端口 快捷键win R 输入cmd 回车 打开cmd窗口 查看所有的端口进程 请输入netstat ano 查看某个特定端口 输入netstat ano findstr 8089 关闭某个端口进程 输入taskkill f p
  • Javaweb

    一 创建包和类来编译servlet程序 二 编译和运行
  • 如何在老版本浏览器中丝滑地使用JS新特性(ES6)

    如何在老版本浏览器中丝滑地使用JS新特性呢 如何在老版本浏览器中丝滑地使用JS新特性呢 有两种方法可以帮助我们实现 第一种方法就是我们用JS原有的方法 自己去实现JS的新特性 不是说好的丝滑使用新特性吗 就这 哈哈哈 别急 客官留步 我还有
  • spring boot 数据库层

    项目开启 首先设计数据库以及存储表 表的联系 需要存贮的信息 基本表的性质 基本表与中间表 临时表不同 因为它具有如下四个特性 1 原子性 基本表中的字段是不可再分解的 2 原始性 基本表中的记录是原始数据 基础数据 的记录 3 演绎性 由
  • openid和unionid的区别

    openid和unionid的区别 1 微信openid和unionid长度是不一样的 openid 28 unionid 29 2 openid同一用户同一应用唯一 unionid同一用户不同应用唯一 这里的不同应用是指在同一微信开发平台
  • C++学习6

    堆 是存在于某个作用域的一个内存空间 例如 当你调用函数 函数本身会形成一个栈用来放置它所接收的参数 以及返回地址 栈 由操作系统提供的一个全局的内存空间 程序可动态分配 内存管理 生命周期 栈对象 离开堆的作用域 会调用对象的析构函数 内
  • rabbitmq分布式事务解决方案

    发送消息到mq 流程 用户下订单创建订单信息 且创建一条订单冗余信息 status 为 0 发送订单信息到mq 使用ack 消息确认机制 确认消息发送成功修改订单状态为 1 表示消息已发送 启动一个定时任务 排查 订单状态为 0 的订单 发
  • Win2003搭建网站教程

    1 搭建Win2003虚拟机 此过程略 2 开始 管理您的服务器 添加或删除角色 3 下一步 配置您的服务器向导 选择应用程序服务器 IIS asp NET 下一步 完成安装 4 打开 开始 管理工具 Internet信息服务器 IIS 管
  • 使用certbot 生成 Let‘s Encrypt 泛域名ssl证书

    文章目录 一 更新证书报错 二 Let s Encrypt 泛域名ssl证书申请 一 更新证书报错 问题描述 更新SSL证书时报 too many failed authorizations 错误 原因分析 当前要更新的域名一个小时触发失败
  • 扫码支付终结刷脸支付强势掘起

    手机支付将会終结 新的支付方式掘起 新的支付方式对很多人还是很陌生的 这就要很好的推广和布置 现在推出了二代的蜻蜓刷脸设备 向商户销售出了舒缓的二代蜻蜓刷脸支付设备 超市 快餐厅 自动贩卖机都已经实现商业直播 相信很快在每个城市 都会发现这
  • 快速排序详解

    近些天来 由于需要找工作 特将数据机构与算法中的快速排序温习总结了一下 希望对于大家学习有所帮助 首先 快速排序的基本思想是基于分治的思想 是冒泡排序的改进型 首先在数组中选择一个基准点 该基准点的选取可能影响快速排序的效率 后面讲解选取的