2013-06-21 82 views
0
function quick($a) { 
    if (count($a) < 2) return $a; 
    $l = []; 
    $r = []; 
    $pivot = $a[0]; 
    foreach ($a as $val) { 
     if ($val > $pivot) { 
      $r[] = $val; 
     } else { 
      $l[] = $val; 
     } 
    } 
    return array_merge(quick($l), [$pivot], quick($r)); 
} 

print_r(quick($a)); 

我得到這個錯誤:這個快速排序功能有什麼問題?

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 72 bytes) in /Applications/XAMPP/xamppfiles/htdocs/sort.php on line 46 

46號線是$l[] = $val;

回答

4

這很簡單。你會得到近乎無限的遞歸。

的原因是,你不排除從子陣列的支點。所以$l將永遠包含它。如果$pivot是不是數組中最小的值,你會無限地與空$r陣列,並複製到$a遞歸$l ...

相反,你需要調整,如果條件並期待在轉動鑰匙:

$pivot = $a[0]; 
foreach ($a as $key => $val) { 
    if ($key === 0) { 
     continue; // pivot 
    } elseif ($val > $pivot) { 
     $r[] = $val; 
    } else { 
     $l[] = $val; 
    } 
} 
+1

就是這樣!我只是做了'$ pivot = array_shift($ a)'並且工作,謝謝 – Ziarno

+0

這也可以做到這一點......無論哪種方式的作品。你一定要防止它使它成爲無論是兩個子陣列的... – ircmaxell

+0

@ircmaxell只是出於好奇,是有過在那裏像這樣的出執行本地的PHP數組排序功能的情況? – Orangepill