实现代码
代码地址:https://github.com/ParrySMS/Exp/tree/master/ProLang/quickSort
递归法 quickSortRec.php
<?php
function quickSortR(array $ar){
$size = sizeof($ar);
if($size<=1){
return $ar;
}
$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
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();
$_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
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);
$stime = microtime(true);
$iterAr = quickSortI($ar);
$etime = microtime(true);
$iterTime = 1000 * ($etime - $stime);
$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 |