php集計ソートアルゴリズムの例
詳細
ポインタ型の集計アルゴリズムを見るのは面倒で、自分で1つ書いて、自分で勉強するために使います.
ポインタ型の集計アルゴリズムを見るのは面倒で、自分で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;
}