這篇文章介紹的內容是關於在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.0363
#0.987947607
0.0363
|
|
|
|
|
|
########################################################################################。 ######################模式######平均數(陣列長度50)######變異數(陣列長度50)## ################迭代Iter /ms######0.081454897######0.000522679#############遞迴Rec /ms ######0.066546392######0.000362922##################相關推薦:#########PHP排序之冒泡排序############PHP排序演算法系列之插入排序實例分享#############PHP排序演算法之堆排序詳解#######
以上是PHP快速排序問題的遞歸演算法實作與迭代演算法實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!