排序算法学习之路——快速排序

2023-11-11

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

上面部分是引用网上的说法,我对这些定义总是记不太清楚。

我们下面直接看实现步骤

  1. 从数列中挑出一个元素,称为 “基准”(这个基准的找出方式有很多,在这里我们就默认使用第一个元素作为基准)
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 从第二步中得到的基准的中间位置将数组分成两部分,递归地(recursive)把小于基准值元素的子序列和大于基准值元素的子序列排序。
  4. 重复第二步,直到子序列的数值个数为1

其中一次排序的过程可以参考下图
快速排序

上面我们了解了一趟找基准位置的过程,下面我们做的只需要通过递归的方式按照基准的位置分割数组,依次对子数组进行上述过程。

下面我们看实现过程

function FindPv(&$arr,$s,$e){
    $p = $s; //基准起始位置
    $v = $arr[$p];  //将数组的第一个值作为基准值
    while($s<$e){
        while($arr[$e]>$v&&$e>$p){
            $e--;
        }
        $arr[$p] = $arr[$e];
        $p = $e;
        while($arr[$s]<$v&&$s<$p){
            $s++;
        }
        $arr[$p] = $arr[$s];
        $p = $s;
    }
    $arr[$p] = $v;
    return $p;
}
function PvSort(&$arr,$s,$e){
    if($s>=$e) return ;
    $nextP = FindPv($arr,$s,$e);  //找到下一个基准所在位置
    PvSort($arr,$s,$nextP-1);
    PvSort($arr,$nextP+1,$e);
}
$arr = array(10,6,8,23,4,1,17,56,32,50,11,9);
PvSort($arr);
print_r($arr);

以上是通过递归的方式实现快速排序的。递归,使用起来非常方便,可以使我们整体上把握程序的架构。对于底层的细节,系统已经帮我们做了,其实递归的底层借助的就是栈的机制。 我们自己亦可以不用递归,直接借助栈的机制实现上述快速排序算法,可以查看 快速排序 非递归实现。这样将更有助于我们对算法的实现机制有更深的理解。

希望本篇对大家有所帮助。

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

排序算法学习之路——快速排序 的相关文章

随机推荐

  • Java的HttpServletResponse对象使用(请求和响应)

    一 学习目标 1 HttpServletResponse对象 2 HttpServletResponse应用 3 RequestDispatcher接口 二 重点知识 Servlet最主要的作用就是处理客户端请求 并向客户端做出响应 为此
  • 2021-10-04

    Centos 7安装Notepad 安装snap sudo yum install epel release sudo yum install snapd sudo systemctl enable now snapd socket sud
  • 使用TWRP Recovery刷入CM13等第三方ROM教程

    http www miui com thread 4492914 1 1 html 首先 可以使用论坛里发布的中文TWRP或者我改的http www miui com forum php mo page 1 pid124770869里的中文
  • 巧解高并发之消息压缩

    随着互联网的发展 高并发问题几乎是每个企业都会面临的问题 而目前解决高并发最受欢迎的便是微服务 通过类似于增加服务器数量而达到一种 人多力量大的 效果 而解决这类问题除了增加 人 的数量 还可以精简任务 降低繁琐度 那么目标就到了消息上 既
  • 量化投资学习——一些牛比的量化投资公司

    Jane Street Jane Street是华尔街最神秘的交易公司 以关注科技和股票交易而闻名 去年他们总交易额达到了5万亿美元 Jane Street公司成立于2000年 目前拥有600多名员工 每天股权交易量高达130亿美元 有消息
  • 多线程造成的资源以及系统状态问题 ==> 多线程造成状态混乱 :参考文章

    为什么80 的码农都做不了架构师 gt gt gt 实战体会Java多线程编程精要 在 Java 程序中使用多线程要比在 C 或 C 中容易得多 这是因为 Java 编程语言提供了语言级的支持 本文通过简单的编程示例来说明 Java 程序中
  • jeesite图片上传并显示

    前几天大哥叫我搞个这的需求出来 上传图片并展示出来 并且后台对图片进行裁剪上传 前端传来的图片是个base64的编码 格式的图片 点击新增 点击上传图片 可进行裁剪 然后上传并且展示出来 前端form页面附上 记住 path路径一定要对上
  • jmeter

    我整理了一下性能测试的一些常见指标 大家看看还有没有需要完善的 性能测试是评估系统在特定工作负载下的能力和可靠性的过程 常见的性能测试指标包括以下几种 1 响应时间 Response Time 系统从接收请求到返回响应所需的时间 2 吞吐量
  • 一文读懂运放规格书参数(2)

    1 电源抑制比 Power supply rejection ratio PSRR 定义 双电源供电电路中 保持负电源电压不变 输入不变 而让正电源产生变化幅度为 VS 频率为 f 的波动 那么在输出端会产生变化幅度为 Vout 频率为 f
  • IEEEE trans模板中怎么使用algorithm2e

    IEEEE trans模板中怎么使用algorithm2e 本文主要记录如何在IEEEE trans模板中使用algorithm2e 避免踩坑 找不到解决方案 目录 IEEEE trans模板中怎么使用algorithm2e 1 注释掉该注
  • 2003系统internet信息服务器,WindowsServer2003创建和管理Internet信息服务器.docx

    F图 F图 Windows Server 2003 实训报告 班级 软件设计10 2姓名学号得分 实训九 创建和管理In ternet信息服务器 实训目的 掌握Web FTP服务器的配置 实训环境 1 装有 Windows Server 2
  • pssh远程批量执行命令

    Pssh pssh是python写的可以并发在多台机器上批量执行命令的工具 它的用法可以媲美ansible的一些简单用法 执行起来速度比ansible快它支持文件并行复制 远程命令执行 杀掉远程主机上的进程等等 杀手锏是文件并行复制 当进行
  • 【Spring Boot】详解restful api

    目录 1 restful api 1 1 历史 1 2 内容 1 3 传参 2 Spring Boot中的Restful Api 1 restful api 1 1 历史 RESTful API Representational State
  • netty入门实例

    Netty 5用户指南 http ifeve com netty5 user guide Netty是一个NIO框架 使用它可以简单快速地开发网络应用程序 比如客户端和服务端的协议 Netty大大简化了网络程序的开发过程比如TCP和UDP的
  • PCL 获取格网最低点(C++详细过程版)

    格网最低点 一 概述 二 代码实现 三 结果展示 1 原始点云 2 滤波结果 一 概述 获取格网最低点在PCL里有现成的调用函数 具体算法原理和实现代码见 PCL GridMinimum获取栅格最低点 为充分了解GridMinimum算法实
  • Mysql binlog 日志

    Mysql binlog 日志 一 Binlog格式介绍 模式1 Row 日志中会记录成每一行数据被修改的形式 然后在slave端再对相同的数据进行修改 优点 row level模式下 bin log中可以不记录执行的sql语句的上下文相关
  • p-value,q-value,FDR

    假阴性错误 false negative errors 高水平的基因可能偶尔没有检测到 假阳性错误 false positive errors 低水平表达的基因由于扩增偏差 可能显得过于丰富 导致假阳性错误 错误发现率 False Disc
  • SQL语句常用记录_count()常用用法以及和group by的组合用法

    之前听大佬说过 会学习的人将资料写下来 不会学习的人妄想将资料记到脑子里 我觉得还是有一定道理的 好记性不如烂笔头 以此篇博客记录我在实际开发中常用到的sql语句 方便以后查看 相信很多用过sql的人 谈到sql语句第一时间想到的就是 se
  • js动态控制表单的tr,td的显示和隐藏

    无论是事先写好的 还是动态生成的 要找到指定的tr或td都必须知道其相关的一个属性 未必必须是id或name 然后无论是在一个table还是多个 table都可以通过document getElementsByTagNames tr 或td
  • 排序算法学习之路——快速排序

    快速排序是由东尼 霍尔所发展的一种排序算法 在平均状况下 排序 n 个项目要 n log n 次比较 在最坏状况下则需要 n2 次比较 但这种状况并不常见 事实上 快速排序通常明显比其他 n log n 算法更快 因为它的内部循环 inne