php递归实现冒泡排序,PHP快速排序问题的递归算法实现和迭代算法实现

9c98fe03383ffeca78ca12f3181f2137.png

搞php的iter过来报到 搞php的iter过来报到 1 楼 yanruanxiaoxie 2011-06-14 刚入行的小菜鸟

这篇文章介绍的内容是关于在PHP快速排序问题的递归算法实现和迭代算法实现 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

实现代码

代码地址:https://github.com/ParrySMS/Exp/tree/master/ProLang/quickSort

递归法 quickSortRec.php<?php /**

* Created by PhpStorm.

* User: L

* Date: 2018-4-13

* Time: 23:27

*//** 递归法快排序

* @param array $ar

* @return array

*/function quickSortR(array $ar){

//判断数组长度

$size = sizeof($ar); if($size<=1){ return $ar;

} //用两个数组分别接受比游标key小和比key大的数据

$left = array(); $right = array(); $key = $ar[0]; for($i =1;$i

}else{ $right[] = $ar[$i];

}

} //内部再进行排序

$left = quickSortR($left); $right = quickSortR($right); //最后合并

return array_merge($left,array($key),$right);

}

迭代法 quickSortIter.php<?php /**

* Created by PhpStorm.

* User: L

* Date: 2018-4-14

* Time: 14:51

*//** 迭代法

* @param array $ar

* @return array

*/function quickSortI(array $ar){

$stack = array($ar); $sort = array(); //判断数组长度

$size = sizeof($ar); if ($size <= 1) { return $ar;

} //栈空即跳出循环

while ($stack) { $arr = array_pop($stack); if (count($arr) <= 1) { if (count($arr) == 1) { $sort[] = &$arr[0];

} continue;

} $key = $arr[0]; $high = array(); $low = array(); //用两个数组分别接受比游标key小和比key大的数据

$_size = count($arr); for ($i = 1; $i < $_size; $i++) { if ($arr[$i] <= $key) { $high[] = &$arr[$i];

} else { $low[] = &$arr[$i];

}

} if (!empty($low)) {//数据入站

array_push($stack, $low);

}

array_push($stack, array($arr[0])); if (!empty($high)) {

array_push($stack, $high);

}

} return $sort;

}

执行时间测试脚本 test.php<?php /**

* Created by PhpStorm.

* User: L

* Date: 2018-4-17

* Time: 23:45

*/require "quickSortIter.php";require "quickSortRec.php";

define('SORT_TIMES', 100);

define('SIZE', 1000);function rowTable(){

unset($row); $row = array(); for ($i = 0; $i < SORT_TIMES; $i++) { $row = getSortRow($row);

} foreach ($row as $r) { print <<< TR

$r->iter$r->rec

TR;

}

}function getSortRow(array $row){

unset($ar); $ar = array(); for ($i = 0; $i < SIZE; $i++) { $ar[] = rand(0, SIZE*2);

} $stime = microtime(true); $recAr = quickSortR($ar); $etime = microtime(true); $recTime = 1000 * ($etime - $stime);// echo"
";

$stime = microtime(true); $iterAr = quickSortI($ar); $etime = microtime(true); $iterTime = 1000 * ($etime - $stime);// print_r($recAr);// echo "
";// print_r($iterAr);

$row[] = (object)["iter" => $iterTime, "rec" => $recTime]; return $row;

}?>

迭代 Iter/ms递归 Rec/ms

5000次执行时间效率对比模式/执行ms时间平均数(数组长度1000)方差(数组长度1000)迭代 Iter /ms2.8405724760.03862993

递归 Rec /ms3.0713635680.06567554模式平均数(数组长度400)方差(数组长度400)迭代 Iter /ms0.9876660350.015847294

递归 Rec /ms0.9879476070.036398175模式平均数(数组长度50)方差(数组长度50)迭代 Iter /ms0.0814548970.000522679

递归 Rec /ms0.0665463920.000362922

实现代码

代码地址:https://github.com/ParrySMS/Exp/tree/master/ProLang/quickSort

递归法 quickSortRec.php<?php /**

* Created by PhpStorm.

* User: L

* Date: 2018-4-13

* Time: 23:27

*//** 递归法快排序

* @param array $ar

* @return array

*/function quickSortR(array $ar){

//判断数组长度

$size = sizeof($ar); if($size<=1){ return $ar;

} //用两个数组分别接受比游标key小和比key大的数据

$left = array(); $right = array(); $key = $ar[0]; for($i =1;$i

}else{ $right[] = $ar[$i];

}

} //内部再进行排序

$left = quickSortR($left); $right = quickSortR($right); //最后合并

return array_merge($left,array($key),$right);

}

迭代法 quickSortIter.php<?php /**

* Created by PhpStorm.

* User: L

* Date: 2018-4-14

* Time: 14:51

*//** 迭代法

* @param array $ar

* @return array

*/function quickSortI(array $ar){

$stack = array($ar); $sort = array(); //判断数组长度

$size = sizeof($ar); if ($size <= 1) { return $ar;

} //栈空即跳出循环

while ($stack) { $arr = array_pop($stack); if (count($arr) <= 1) { if (count($arr) == 1) { $sort[] = &$arr[0];

} continue;

} $key = $arr[0]; $high = array(); $low = array(); //用两个数组分别接受比游标key小和比key大的数据

$_size = count($arr); for ($i = 1; $i < $_size; $i++) { if ($arr[$i] <= $key) { $high[] = &$arr[$i];

} else { $low[] = &$arr[$i];

}

} if (!empty($low)) {//数据入站

array_push($stack, $low);

}

array_push($stack, array($arr[0])); if (!empty($high)) {

array_push($stack, $high);

}

} return $sort;

}

执行时间测试脚本 test.php<?php /**

* Created by PhpStorm.

* User: L

* Date: 2018-4-17

* Time: 23:45

*/require "quickSortIter.php";require "quickSortRec.php";

define('SORT_TIMES', 100);

define('SIZE', 1000);function rowTable(){

unset($row); $row = array(); for ($i = 0; $i < SORT_TIMES; $i++) { $row = getSortRow($row);

} foreach ($row as $r) { print <<< TR

$r->iter$r->rec

TR;

}

}function getSortRow(array $row){

unset($ar); $ar = array(); for ($i = 0; $i < SIZE; $i++) { $ar[] = rand(0, SIZE*2);

} $stime = microtime(true); $recAr = quickSortR($ar); $etime = microtime(true); $recTime = 1000 * ($etime - $stime);// echo"
";

$stime = microtime(true); $iterAr = quickSortI($ar); $etime = microtime(true); $iterTime = 1000 * ($etime - $stime);// print_r($recAr);// echo "
";// print_r($iterAr);

$row[] = (object)["iter" => $iterTime, "rec" => $recTime]; return $row;

}?>

迭代 Iter/ms递归 Rec/ms

5000次执行时间效率对比模式/执行ms时间平均数(数组长度1000)方差(数组长度1000)迭代 Iter /ms2.8405724760.03862993

递归 Rec /ms3.0713635680.06567554模式平均数(数组长度400)方差(数组长度400)迭代 Iter /ms0.9876660350.015847294

递归 Rec /ms0.9879476070.036398175

模式平均数(数组长度50)方差(数组长度50)迭代 Iter /ms0.0814548970.000522679

递归 Rec /ms0.0665463920.000362922相关推荐:

PHP排序之冒泡排序

PHP排序算法系列之插入排序实例分享

PHP排序算法之堆排序详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值