【发布时间】:2012-02-22 18:45:43
【问题描述】:
我尝试在 PHP 中编写一个涉及一个小数组的基本合并排序,但问题是执行大约需要一分钟左右,然后返回:
致命错误:允许的内存大小为 536870912 字节已用尽(已尝试 在第 39 行的 /Users/web/www/merge.php 中分配 35 个字节)
有没有人知道代码可能出错的地方(如果有的话)?我已经盯着这个看了好一个小时了。
<?php
$array = array(8,1,2,5,6,7);
print_array($array);
merge_sort($array);
print_array($array);
function merge_sort(&$list){
if( count($list) <= 1 ){
return $list;
}
$left = array();
$right = array();
$middle = (int) ( count($list)/2 );
// Make left
for( $i=0; $i < $middle; $i++ ){
$left[] = $list[$i];
}
// Make right
for( $i = $middle; $i < count($list); $i++ ){
$right[] = $list[$i];
}
// Merge sort left & right
merge_sort($left);
merge_sort($right);
// Merge left & right
return merge($left, $right);
}
function merge(&$left, &$right){
$result = array();
while(count($left) > 0 || count(right) > 0){
if(count($left) > 0 && count(right) > 0){
if($left[0] <= $right[0]){
$result[] = array_shift($left);
} else {
$result[] = array_shift($right);
}
} elseif (count($left) > 0){
$result[] = array_shift($left);
} elseif (count($right) > 0){
$result[] = array_shift($right);
}
}
print_array($result);exit;
return $result;
}
function print_array($array){
echo "<pre>";
print_r($array);
echo "<br/>";
echo "</pre>";
}
?>
【问题讨论】:
-
虽然这不是您的问题,但请注意 PHP 的最大递归限制为 100。当给定足够大的数组时,您最终可能会达到此限制。
-
查看此网站以获得更多帮助:php.net/manual/en/array.sorting.php
-
我不熟悉算法,但我建议在代码的各个点做一些回显/退出,看看你是否正确地得到中间步骤?
-
最好包含一个指向您正在尝试做的事情的链接:en.wikipedia.org/wiki/Merge_sort。我个人会使用 php 的本机(用 C 编写)排序算法——我认为 php 代码的效率会低于 php 的本机快速排序方法。为什么快速排序会比合并排序更好的解释(除了明显的原生 vs PHP 代码可以在这里找到:stackoverflow.com/questions/680541/quick-sort-vs-merge-sort
-
@Arend 我创建合并排序纯粹是为了理解它并练习实现它。