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

news/2024/5/19 21:28:57 标签: 排序算法, 算法, 快速排序

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

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

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

我们下面直接看实现步骤

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

其中一次排序的过程可以参考下图
<a class=快速排序" />

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

下面我们看实现过程

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);

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

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


http://www.niftyadmin.cn/n/756615.html

相关文章

补发2

转载于:https://www.cnblogs.com/lihang666/p/6130098.html

全面介绍9种常用的排序算法

本篇给大家介绍几种软件工程中常用的排序算法 所有排序算法的核心的代码都在《常用排序算法核心代码》有介绍 插入排序 插入排序的基本思想就是&#xff1a;每次将一个待排序的记录&#xff0c;按其关键字大小插入到前面已经排序好的序列中&#xff0c;直到全部记录插入完成…

【腾讯Bugly干货分享】打造“微信小程序”组件化开发框架

本文来自于腾讯Bugly公众号&#xff08;weixinBugly&#xff09;&#xff0c;未经作者同意&#xff0c;请勿转载&#xff0c;原文地址&#xff1a;http://mp.weixin.qq.com/s/2nQzsuqq7Avgs8wsRizUhw 作者&#xff1a;Gcaufy 导语 Bugly 之前发了一篇关于微信小程序的开发经验分…

全面介绍插入排序

何谓‘插入排序’&#xff1f; 其概念如是说&#xff1a;每次将一个待排序的记录&#xff0c;按其关键字大小插入到前面已经排序好的序列中&#xff0c;直到全部记录插入完成为止。 概念的东西总是有些抽象&#xff0c;也可称其为基本思想。上述插入排序的概念同样也可说是插入…

RabbitMq、ActiveMq、ZeroMq 和 kafka 比较

MQ框架非常之多&#xff0c;比较流行的有RabbitMq、ActiveMq、ZeroMq、kafka。这几种MQ到底应该选择哪个&#xff1f;要根据自己项目的业务场景和需求。下面我列出这些MQ之间的对比数据和资料。第一部分&#xff1a;RabbitMQ,ActiveMq,ZeroMq比较1、 TPS比较一ZeroMq 最好&…

全面分析冒泡排序过程

冒泡排序也是一种简单直观的排序算法。其思想是&#xff1a;它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成。这个算法的名字…

[转]Hibernate入门:批量插入数据

转自&#xff1a;http://blog.csdn.net/xiazdong/article/details/7709068 一般如果要插入100万条数据&#xff0c;则会写如下代码&#xff1a; [java] view plaincopy package org.xiazdong.test; import junit.framework.TestCase; import org.hibernate.Session; imp…

Go IF 条件语句

条件语句需要开发者通过指定一个或多个条件&#xff0c;并通过测试条件是否为 true 来决定是否执行指定语句&#xff0c;并在条件为 false 的情况在执行另外的语句。 以下是在大多数编程语言中发现的典型条件语句的一般形式的流程图 Go 语言提供了以下几种条件判断语句&#x…