クイックソート

夏の青春の思い出に、クイックソートPHPで実装しなさい的な、問題がでてたような気がする。んでとりあえず、下記のように二つ実装してみたんですが、さてこの二つは何が違うでしょう?もうおねむのじかんなので答えは明日以降気が向いたら書きます。まぁたいした事じゃないけど、、、ネタがないんで許してねっと。

まぁ実装の仕方が下手糞なのは置いといてw、二つの関数は、どのような違いあるかを一言で説明してくれると嬉しす。

■ パターン1

<?php
$hoge = array(4, 5, 2, 6, 1, 3, 10);
function quick_sort($hoge){

    if( count($hoge) <= 1){
        return $hoge;
    }
    $pivot = $hoge[floor(count($hoge)/2)];

    $right = array();
    $left = array();
    for($i=0; $i< count($hoge) ; $i++)
    {
        if($i == floor(count($hoge)/2))
            continue;

        if($hoge[$i] <= $pivot){
            $left[]  = $hoge[$i];
        }else{
            $right[] = $hoge[$i];
        }
    }
    return array_merge(quick_sort($left),array($pivot),quick_sort($right));
}
print_r(quick_sort($hoge));

■ パターン2

<?php
$hoge = array(4, 5, 2, 6, 1, 3, 10);
function quick_sort(&$hoge, $l_idx=0, $r_idx=null)
{
    if($r_idx === null) $r_idx = count($hoge)-1;

    //終了条件
    if($l_idx >= $r_idx){
        return;
    }

    $pivot = $hoge[$r_idx];
    $i = $l_idx-1;
    $j = $r_idx;
    while(1){
        while(isset($hoge[++$i]) && $hoge[$i] < $pivot);
        while(isset($hoge[--$j]) && $hoge[$j] > $pivot);
        if($i >= $j) break;
        //swap
        $tmp = $hoge[$i];
        $hoge[$i] = $hoge[$j];
        $hoge[$j] = $tmp;
    }
    //swap
    $tmp = $hoge[$i];
    $hoge[$i] = $hoge[$r_idx];
    $hoge[$r_idx] = $tmp;

    quick_sort($hoge, $l_idx, $i-1);
    quick_sort($hoge, $i+1, $r_idx);
}
quick_sort($hoge);
print_r($hoge);