php集計ソートアルゴリズムの例

2822 ワード

詳細
ポインタ型の集計アルゴリズムを見るのは面倒で、自分で1つ書いて、自分で勉強するために使います.

 30, 1 => 66, )
start : 2 end: 3     :array ( 0 => 6, 1 => 45, )
start : 0 end: 3     :array ( 0 => 6, 1 => 30, 2 => 45, 3 => 66, )
    :array ( 0 => 6, 1 => 30, 2 => 45, 3 => 66, )
 * 
 * 
 * @author xieye
 */

$arr = [30, 66,   45,6,]; //     
$sort_arr =  merge_sort( $arr );  //   
echo  "    :".var_export( $sort_arr, 1 ) ; //    

//        
function merge_sort ( array $arr )
{
    return  msort( $arr, 0, count( $arr ) - 1 );
}

//     ,  ,              。
function msort ( array $arr, $start, $end )
{
    //        1 ,$start == $end,     ,    。
    if ($start < $end) {
        $mid = floor( ( $start + $end ) / 2 ); //   $arr     $arr[$start - $mid]   $arr[$mid+1 - $end]
        $arr = msort( $arr, $start, $mid ); //   ,  $arr[$start - $mid]       $arr[$start - $mid]
        $arr = msort( $arr, $mid + 1, $end ); //   ,  $arr[$mid+1 - $end]        $arr[$mid+1 - $end]

        $temparr = merge( $arr, $start, $mid, $end ); //   , $arr[$start - $mid]   $arr[$mid+1 -end]           $arr[$start - $end]
        echo "start : {$start}  end: {$end} "."     :".  var_export( $temparr, 1 )."
"; foreach ($temparr as $v) { // , , 。 $arr[$start ++] = $v; } } return $arr; } // , 。 // start mid ,mid end 。 。 // , 。 function merge ( array $arr, $start, $mid, $end ) { $temparr = []; // 。 $arr_left = array_slice( $arr, $start, $mid - $start + 1 ); $arr_right = array_slice( $arr, $mid + 1, $end - $mid ); while ($arr_left || $arr_right) { // left right , 。 if ($arr_left && $arr_right) { // , , 。 if ($arr_left[0] < $arr_right[0]) { $temparr[] = array_shift( $arr_left ); // } else { $temparr[] = array_shift( $arr_right ); // , 。 } } elseif (! $arr_left) { // else : , , 。 $temparr[] = array_shift( $arr_right ); } else { $temparr[] = array_shift( $arr_left ); } } return $temparr; }