我曾試圖用PHP編寫一個基本的合併排序涉及一小陣,但問題是它需要大約一分鐘左右來執行,並返回:寫作歸併排序
Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 35 bytes) in /Users/web/www/merge.php on line 39
有誰有一個想法,代碼可能會出錯(如果有的話)?我一直盯着這個好一個小時。
<?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.當給定足夠大的值時,最終可能達到此限制rray。 – Charles 2012-02-22 18:48:43
檢查這個網站的更多幫助:http://php.net/manual/en/array.sorting.php – 2012-02-22 18:49:16
我不熟悉算法,但我會建議做一些回聲/退出在代碼,看看你是否正確地獲得中間步驟? – halfer 2012-02-22 18:50:24