php实现快速排序的三种方法分享

来源:脚本之家  责任编辑:小易  

这个主要就是用for循环做的:第一步是用第一个数字2和其他的数字比较:4,6,8,2然后用4和其他数

写了三种php快速排示例,第一种效率低但最简单最容易理解,第二个是算法导论上提供的单向一次遍历找中值方法,第三种是双向遍历找中值经典快排算法。三组算法实现和比较如下:

<?phpfunction quickSort($array){if(count($array

方法一:该方法比较直观,但损失了大量的空间为代价,使用了效率较低的merge函数。在三种方法中效率最低。最坏情况下算法退化为(O(n*n))

天意子是一种奇特而坚硬的果实。生长在印度、尼泊尔、孟加拉、不丹一带的一种大型常绿阔叶林中。扁圆的形状,隆起瓣瓣的曲脊,看似蟠桃,又像细小的蕃瓜。佛经里有天意树,此树随天意而转,悉遂所求。天意子便有其特殊的含义,用此珠修练,顺遂天意;随意佩带,可增福慧。盘玩方法1)用搓澡巾用力的搓表面。作用其实是清洁表面的腊层和脏色以及进行再抛光,两三天大约每天2-3小时。2)用柔软的棉布盘搓一个星期。这时软布表面会有痕迹这都是正常现象,一个星期后颜色会变淡。3)自然放置一个星期。让珠子自然干燥,同时表面均匀的和空气接触形成细密均匀的氧化保护层。4)开始手盘。这时的手一定是要刚刚洗过并且已经干透,汗手请不要直接

复制代码 代码如下:

我自己是挺喜欢看熊出没的,不是因为搞笑,是我很欣赏光头强。光头强很孝顺,能为父母着想,不让他们担心。还经常能给父母寄东西过去。光头强他是为了生活才砍树,可是,熊大熊二就是要去揍他,还说什么保护森林,熊熊有责。我在想,光头强砍树是为了生活,可是他们吃蜂蜜也是为了生活,光头强砍树,熊就去揍他,熊吃蜂蜜时,光头强有打扰过吗?光头强有想过要杀了两头熊,可每次都是下不去手,说明他是一个保护动物的人,都是熊弄他,光头强受不了了,才会拿枪打他们。他们跟本不知道光头强为啥砍树,就去揍他,光头强不砍树他怎么生活啊?!还有,熊他们泰坦吃了,总是要去光头强家找吃的,而光头强他一点小小的要求都不能答应。我还记得,有一

function quick_sort($array) {

昨天刚朋友买了3个保温杯留教师节送给老师,今天就遇到这个问题。本来这就是你情我愿的事,没有什么该不该之说。就像母亲节父亲节一样,送了是心意,不送也没人怪。老师也不会给你孩子小鞋穿,毕竟现在言论自由传播力度大,没有老师会顶风作案。你可以问问别的家长,大家可以一起送些实用的,不那么贵重的物品。我的朋友让我帮买的都是几十块钱的东西,买束花也得这个钱不是吗。有的时候随大流对孩子也好,人家都送就你不送,孩子也不舒服。在孩子眼里这就是一种仪式。

 if(count($array) <= 1) return $array;

粗略看了一圈,似乎以推荐少女漫居多,我来推荐几篇青年向的漫画。排名不分先后。《王者天下》关键词:战国、军事、成长、斗智斗力以历史上真实人物秦将李信为主人公,讲述年轻的秦王嬴政统一六国、李信成为天下第一大将军的故事。作者用超大脑洞演绎历史真实人物和事件,无论战斗还是智谋都很有看点。连载中《甲贺忍法帖》关键词:忍术、格斗、微情色。战国背景,讲述甲贺、伊贺两族忍者卷入德川家康继承人争夺战的故事。剧情紧凑,战,斗华丽,画面精致。已完结《PLUTO》关键词:机器人、未来、解谜。浦泽直树与手冢治虫两位大神的强强联手。讲述几个超级机器人之间暗杀与侦查的故事。完美植入美伊战争和审判萨达姆。感人至深,篇幅长度正

 $key = $array[0];

 $rightArray = array();

 $leftArray = array();

 for($i = 1; $i < count($array); $i++) {

           if($array[$i] >= $key) {

  $rightArray[] = $array[$i];

    } else {

  $leftArray[] = $array[$i];

    }

 }

 $leftArray = quick_sort($leftArray);

 $rightArray = quick_sort($rightArray);

 return array_merge($leftArray, array($key), $rightArray);

}

方法二:该算法来自算法导论,叫作Nico Lomuto方法(感兴趣goole上有详细说明)使用最经典的单方向一次遍历找到中值。

但这种算法在最坏情况下(例如值相同的数组,需要n-1次划分,每一次划分需要O(n) 时间去掉一个元素)最坏情况下为O(n*n)

复制代码 代码如下:

我自己是挺喜欢看熊出没的,不是因为搞笑,是我很欣赏光头强。光头强很孝顺,能为父母着想,不让他们担心。还经常能给父母寄东西过去。光头强他是为了生活才砍树,可是,熊大熊二就是要去揍他,还说什么保护森林,熊熊有责。我在想,光头强砍树是为了生活,可是他们吃蜂蜜也是为了生活,光头强砍树,熊就去揍他,熊吃蜂蜜时,光头强有打扰过吗?光头强有想过要杀了两头熊,可每次都是下不去手,说明他是一个保护动物的人,都是熊弄他,光头强受不了了,才会拿枪打他们。他们跟本不知道光头强为啥砍树,就去揍他,光头强不砍树他怎么生活啊?!还有,熊他们泰坦吃了,总是要去光头强家找吃的,而光头强他一点小小的要求都不能答应。我还记得,有一

function quick_sort(&$array, $start, $end) {

    if ($start >= $end) return;

    $mid = $start;

    for ($i = $start + 1; $i <= $end; $i++) {

 if ($array[$i] < $array[$mid]) {

     $mid++;

     $tmp = $array[$i];

     $array[$i] = $array[$mid];

     $array[$mid] = $tmp;

 }

    }

    $tmp = $array[$start];

    $array[$start] = $array[$mid];

    $array[$mid] = $tmp;

    quick_sort($array, $start, $mid - 1);

    quick_sort($array, $mid + 1, $end);

}

方法三:该方法基本上是教科书式的常见写法,首先从左向右遍历小于中间元素的跳过,同时从右向左遍历遇到大的元素跳过,然后

如果没有交叉着交换两边值,继续循环,直到找到中间点。注意该方法在处理相同元素的时候,仍旧交换,这样在最坏情况下也有O(nlogn)

效率。但下面的函数中,如果将$array[$right] > $key 改成 $array[$right] >=$key 或将 $array[$left] < $key改成$array[$left] <= $key则最坏

情况不但会堕落为O(n*n).而且除了每次比较的消耗外,还会产生n次交互的额外开销。该题还有另外两个考点,针对死记硬背的同学:

1:中间的两个while可否互换。当然不能互换,因为对于快盘需要一个额外的空间保存初始的左值,这样左右互换的时候,先用右边覆盖已经保存

为中值的左值,否则会出现问题。见这句$array[$left] = $array[$right];

2:$array[$right] = $key; 该语句含义可否省略。该句不能省略,大家可以考虑一个极端情况比如两个值的排序(5,2),逐步看下就明白了。

复制代码 代码如下:

我自己是挺喜欢看熊出没的,不是因为搞笑,是我很欣赏光头强。光头强很孝顺,能为父母着想,不让他们担心。还经常能给父母寄东西过去。光头强他是为了生活才砍树,可是,熊大熊二就是要去揍他,还说什么保护森林,熊熊有责。我在想,光头强砍树是为了生活,可是他们吃蜂蜜也是为了生活,光头强砍树,熊就去揍他,熊吃蜂蜜时,光头强有打扰过吗?光头强有想过要杀了两头熊,可每次都是下不去手,说明他是一个保护动物的人,都是熊弄他,光头强受不了了,才会拿枪打他们。他们跟本不知道光头强为啥砍树,就去揍他,光头强不砍树他怎么生活啊?!还有,熊他们泰坦吃了,总是要去光头强家找吃的,而光头强他一点小小的要求都不能答应。我还记得,有一

function quick_sort_swap(&$array, $start, $end) {

 if($end <= $start) return;

 $key = $array[$start];

 $left = $start;

 $right = $end;

 while($left < $right) {

  while($left < $right && $array[$right] > $key)

   $right--;

  $array[$left] = $array[$right];

  while($left < $right && $array[$left] < $key)

   $left++;

  $array[$right] = $array[$left];

 }

 $array[$right] = $key;

 quick_sort_swap(&$array, $start, $right - 1);

 quick_sort_swap(&$array, $right+1, $end);

}

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

thinkphp如何实现快速排序

thinkphp使用的数据库是mysql,mysql多个字段排序的语句:

select

* from `表名` where 条件 order by 字段1 desc,字段2

asc,...

thinkphp中排序方法为

$User->where('score>0')->order('score desc')....;

但是例子中只能单字段排序,不过可以理解成字符串,那就可以这样写试试

$User->where('score>0')->order('score desc,id asc,...')....;

PHP中的快速排序算法如何实现倒序?

/*

php中的快速排序,并且倒序输出

*/

function quickSort($array)

{

if(!isset($array[1]))

return $array;

$mid = $array[0]; //获取一个用于分割的关键字,一般是首个元素

$leftArray = array();

$rightArray = array();

foreach($array as $v)

{

if($v > $mid)

$rightArray[] = $v; //把比$mid大的数放到一个数组里

if($v < $mid)

$leftArray[] = $v; //把比$mid小的数放到另一个数组里

}

$leftArray = quickSort($leftArray); //把比较小的数组再一次进行分割

$leftArray[] = $mid; //把分割的元素加到小的数组后面,不能忘了它哦

$rightArray = quickSort($rightArray); //把比较大的数组再一次进行分割

return array_reverse(array_merge($leftArray,$rightArray)); //组合两个结果后倒序排列

}

使用php语言实现代码,内容为快速排序的核心算法,假设拟需排序对象是某一维数组

<?php 

class Bubble { 

  private function __construct() { 

  } 

  private static function sortt($data) { 

    if (count ( $data ) <= 1) { 

     return $data; 

    } 

    $tem = $data [0]['score']; 

    $leftarray = array (); 

    $rightarray = array (); 

    for($i = 1; $i < count ( $data ); $i ++) { 

      if ($data [$i]['score'] <= $tem ) { 

        $leftarray[] = $data[$i]; 

      } else { 

        $rightarray[] = $data[$i]; 

      } 

    } 

    $leftarray=self::sortt($leftarray); 

    $rightarray=self::sortt($rightarray); 

    $sortarray = array_merge ( $leftarray, array ($data[0]), $rightarray ); 

    return $sortarray; 

  } 

  public static function main($data) { 

    $ardata = self::sortt ( $data ); 

    return $ardata; 

  } 

 

$arr=array( 

  array('sid'=>1,'score'=>76), 

  array('sid'=>2,'score'=>93), 

  array('sid'=>3,'score'=>68.5), 

  array('sid'=>4,'score'=>82.5), 

  array('sid'=>5,'score'=>60.5) 

); 

print_r(Bubble::main($arr));

学习php快速排序,看到别人的源代码,但是运行时发现有三个错误。高手帮忙看看给我哥正确的代码。

调用错了。

<?php

function quicksort($left, $right,&$array){

    $l=$left;

    $r=$right;

    $pivot=$array[($left+$right)/2];

    $temp=0;

    while($l<$r){

        while($array[$l]<$pivot) $l++;

        while($array[$r]>$pivot) $r--;

        if($l>=$r) break;

        $temp=$array[$l];

        $array[$l]=$array[$r];

        $array[$r]=$temp;

        if($array[$l]==$pivot) --$r;

        if($array[$r]==$pivot) ++$l;

    }

    if($l==$r){

        $l++;

        $r--;

    }

    if($left<$r)  quicksort($left,$r,$array);

    if($right>$l) quicksort($l,$right,$array);

}

$arr=array(0, 5, -1, 2);

quicksort(0, count($arr)-1, $arr);

print_r($arr);

PHP中将一个数组用快速排序法算出最大的那个值,那个程序里这样写到 if(count($arr)<

1:这个的作用,只是用于当数组为空或者数组长度为1时,直接原数组返回,什么也不操作了。针对特殊情况下,的确是快的。

  • 本文相关:
  • php使用递归与迭代实现快速排序示例
  • php实现快速排序法函数代码
  • php 快速排序算法详解
  • php冒泡排序、快速排序、快速查找、二维数组去重实例分享
  • php排序算法(冒泡排序,快速排序)
  • 排序算法之php版快速排序、冒泡排序
  • php两种快速排序算法实例
  • php关联数组快速排序的方法
  • php快速排序原理与实现方法分析
  • php常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
  • php递归实现快速排序的方法示例
  • php通过会话控制实现身份验证实例
  • 分享php header函数使用教程
  • php各种异常和错误的拦截方法及发生致命错误时进行报警
  • 源码分析 laravel 重复执行同一个队列任务的原因
  • thinkphp框架page类与bootstrap分页(美化)
  • yii调试sql的常用方法
  • centos php 扩展xchche的安装教程
  • 基于snoopy的php近似完美获取网站编码的代码
  • laravel5.7框架安装与使用学习笔记图文详解
  • laravel接管dingo-api和默认的错误处理方式
  • thinkphp如何实现快速排序
  • PHP中的快速排序算法如何实现倒序?
  • 使用php语言实现代码,内容为快速排序的核心算法,假设拟需排序对象是某一维数组
  • 学习php快速排序,看到别人的源代码,但是运行时发现有三个错误。高手帮忙看看给我哥正确的代码。
  • PHP中将一个数组用快速排序法算出最大的那个值,那个程序里这样写到 if(count($arr)&l...
  • 使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组
  • php快速排序竟然爆出内??不足,代码哪里出问题了呢
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved