PHP快速排序问题的递归算法实现和迭代算法实现
这篇文章介绍的内容是关于在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<$size;$i++){ if($ar[$i]<=$key){ $left[] = $ar[$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
<tr>
<td>$r->iter</td>
<td>$r->rec</td>
</tr>
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"<br/>";
$stime = microtime(true); $iterAr = quickSortI($ar); $etime = microtime(true); $iterTime = 1000 * ($etime - $stime);// print_r($recAr);// echo "<br/>";// print_r($iterAr);
$row[] = (object)["iter" => $iterTime, "rec" => $recTime]; return $row;
}?><table border="1">
<tr>
<th>迭代 Iter/ms</th>
<th>递归 Rec/ms</th>
</tr> <?php rowTable(); ?></table>5000次执行时间效率对比
| 模式/执行ms时间 | 平均数(数组长度1000) | 方差(数组长度1000) |
|---|---|---|
| 迭代 Iter /ms | 2.840572476 | 0.03862993 |
| 递归 Rec /ms | 3.071363568 | 0.06567554 |
| 模式 | 平均数(数组长度400) | 方差(数组长度400) |
|---|---|---|
| 迭代 Iter /ms | 0.987666035 | 0.015847294 |
| 递归 Rec /ms | 0.987947607 | 0.036398175 |
| 模式 | 平均数(数组长度50) | 方差(数组长度50) |
|---|---|---|
| 迭代 Iter /ms | 0.081454897 | 0.000522679 |
| 递归 Rec /ms | 0.066546392 | 0.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<$size;$i++){ if($ar[$i]<=$key){ $left[] = $ar[$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
<tr>
<td>$r->iter</td>
<td>$r->rec</td>
</tr>
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"<br/>";
$stime = microtime(true); $iterAr = quickSortI($ar); $etime = microtime(true); $iterTime = 1000 * ($etime - $stime);// print_r($recAr);// echo "<br/>";// print_r($iterAr);
$row[] = (object)["iter" => $iterTime, "rec" => $recTime]; return $row;
}?><table border="1">
<tr>
<th>迭代 Iter/ms</th>
<th>递归 Rec/ms</th>
</tr> <?php rowTable(); ?></table>5000次执行时间效率对比
| 模式/执行ms时间 | 平均数(数组长度1000) | 方差(数组长度1000) |
|---|---|---|
| 迭代 Iter /ms | 2.840572476 | 0.03862993 |
| 递归 Rec /ms | 3.071363568 | 0.06567554 |
| 模式 | 平均数(数组长度400) | 方差(数组长度400) |
|---|---|---|
| 迭代 Iter /ms | 0.987666035 | 0.015847294 |
| 递归 Rec /ms | 0.987947607 | 0.036398175 |
| 模式 | 平均数(数组长度50) | 方差(数组长度50) |
|---|---|---|
| 迭代 Iter /ms | 0.081454897 | 0.000522679 |
| 递归 Rec /ms | 0.066546392 | 0.000362922 |
以上是PHP快速排序问题的递归算法实现和迭代算法实现 的详细内容。更多信息请关注PHP中文网其他相关文章!
热AI工具
Undress AI Tool
免费脱衣服图片
Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片
AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。
Clothoff.io
AI脱衣机
Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!
热门文章
热工具
记事本++7.3.1
好用且免费的代码编辑器
SublimeText3汉化版
中文版,非常好用
禅工作室 13.0.1
功能强大的PHP集成开发环境
Dreamweaver CS6
视觉化网页开发工具
SublimeText3 Mac版
神级代码编辑软件(SublimeText3)
PHP设置的简单指南
Jul 18, 2025 am 04:25 AM
PHP设置的关键在于明确安装方式、配置php.ini、连接Web服务器及启用必要扩展。1.安装PHP:Linux用apt、Mac用Homebrew、Windows推荐XAMPP;2.配置php.ini:调整错误报告、上传限制等并重启服务器;3.搭配Web服务器:Apache通过mod_php,Nginx使用PHP-FPM;4.安装常用扩展:如mysqli、json、mbstring等以支持完整功能。
在PHP中评论代码
Jul 18, 2025 am 04:57 AM
PHP注释代码常用方法有三种:1.单行注释用//或#屏蔽一行代码,推荐使用//;2.多行注释用/.../包裹代码块,不可嵌套但可跨行;3.组合技巧注释如用/if(){}/控制逻辑块,或配合编辑器快捷键提升效率,使用时需注意闭合符号和避免嵌套。
撰写PHP评论的提示
Jul 18, 2025 am 04:51 AM
写好PHP注释的关键在于明确目的与规范,注释应解释“为什么”而非“做了什么”,避免冗余或过于简单。1.使用统一格式,如docblock(/*/)用于类、方法说明,提升可读性与工具兼容性;2.强调逻辑背后的原因,如说明为何需手动输出JS跳转;3.在复杂代码前添加总览性说明,分步骤描述流程,帮助理解整体思路;4.合理使用TODO和FIXME标记待办事项与问题,便于后续追踪与协作。好的注释能降低沟通成本,提升代码维护效率。
通过评论提高可读性
Jul 18, 2025 am 04:46 AM
写好注释的关键在于说明“为什么”而非仅“做了什么”,提升代码可读性。1.注释应解释逻辑原因,例如值选择或处理方式背后的考量;2.对复杂逻辑使用段落式注释,概括函数或算法的整体思路;3.定期维护注释确保与代码一致,避免误导,必要时删除过时内容;4.在审查代码时同步检查注释,并通过文档记录公共逻辑以减少代码注释负担。
编写有效的PHP评论
Jul 18, 2025 am 04:44 AM
注释不能马虎是因为它要解释代码存在的原因而非功能,例如兼容老接口或第三方限制,否则看代码的人只能靠猜。必须加注释的地方包括复杂的条件判断、特殊的错误处理逻辑、临时绕过的限制。写注释更实用的方法是根据场景选择单行注释或块注释,函数、类、文件开头用文档块注释说明参数与返回值,并保持注释更新,对复杂逻辑可在前面加一行概括整体意图,同时不要用注释封存代码而应使用版本控制工具。
学习PHP:初学者指南
Jul 18, 2025 am 04:54 AM
易于效率,启动启动tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)
快速PHP安装教程
Jul 18, 2025 am 04:52 AM
ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre
掌握PHP块评论
Jul 18, 2025 am 04:35 AM
PHPblockcommentsareusefulforwritingmulti-lineexplanations,temporarilydisablingcode,andgeneratingdocumentation.Theyshouldnotbenestedorleftunclosed.BlockcommentshelpindocumentingfunctionswithPHPDoc,whichtoolslikePhpStormuseforauto-completionanderrorche


