array_filter と create_function でクイックソート

まーPHP 5.2.x 系以前でこういうことやろうとすると当然create_functionなどというひどいものを使わないといけなかったり。つーか、配列の結合が、+ と array_merge のどっちつかうかは何年PHPつかってても身に付かんな。添字配列と連想配列が一緒くたに扱われるPHPだからまあしかたないといえばしかたないんだけど。

<?php

function qsort(Array $list) {
    if (count($list) == 0) {
        return array();
    }   

    $pivot = array_shift($list);

    return array_merge(qsort(array_filter($list, create_function('$x', 'return ($x < ' . $pivot . ');')))
        , array($pivot)
        , qsort(array_filter($list, create_function('$x', 'return ($x >= ' . $pivot . ');'))));
}

function print_array(Array $a) {

    foreach($a as $v) {
        echo "  $v\n";
    }   
    echo "\n";
}

$array = array();
foreach(range(1,10000) as $v) {
    $array[] = mt_rand();
}
print_array(qsort($array));
  34256 
  42274 
  363496
  430324
  811500
  1414511
  2155767
  2158085
  2362754
  2559003
  2687188
...
  2145905351
  2146041602
  2146179876
  2146340678
  2146458622
  2146688188
  2146999472
  2147473020


ちなみに実行時間は、1万の乱数で、乱数配列生成時間も含めて、

% time php qsort.php >/dev/null
php qsort.php > /dev/null  0.61s user 0.05s system 98% cpu 0.664 total

こんなかんじ。