PHPでクイックソートというものをやってみた

一般的に最も高速なソートのアルゴリズムらしい。

アルゴリズム

1. 適当な数(ピボットという)を選択する (この場合はデータの総数の中央値が望ましい)
2. ピボットより小さい数を前方、大きい数を後方に移動させる (分割)
3. 二分割された各々のデータを、それぞれソートする

実装

<?php
function quicksort($array) {
    if (count($array) <= 1) {
        return $array;
    }
    $pivot = array_shift($array); // ピボットの選択

    $left = $right = array();
    foreach ($array as $value) {
        if ($value < $pivot) {
            $left[]  = $value; // ピボットより小さい数は左
        } else {
            $right[] = $value;  // ピボットより大きい数は右
        }
    }
    // 左右のデータを再帰的にソートする
    return array_merge(quicksort($left), array($pivot), quicksort($right));
}

実行

<?php
$array = array(
    6, 4, 3, 7, 8, 5, 2, 9, 1,
);
$array = quicksort($array);
var_dump($array); // 1, 2, 3, 4, 5, 6, 7, 8, 9