plasmasphere.net -プラズマスフィア ドットネット-
Diary
PHPでクイックソート
2006/10/06(Fri) 00:10
昨日のバブルソートに続き、クイックソート(Quick Sort)のソースも置いておきます。
PHPのソートソースって、探しても見つからないんですよね。なんでだろ。
<?php $val = array(12,50,20,1574,67,54,2,35,21); echo "ソート前"; echo "<pre>"; print_r($val); echo "</pre>"; qsort($val, 0, count($val)-1); echo "ソート後"; echo "<pre>"; print_r($val); echo "</pre>\n<hr />\n"; $arr = array( "0" => array( "name" => "名前1", "No" => "3", "value" => "******"), "1" => array( "name" => "名前2", "No" => "1", "value" => "******"), "2" => array( "name" => "名前3", "No" => "2", "value" => "******"), "3" => array( "name" => "名前4", "No" => "5", "value" => "******"), "4" => array( "name" => "名前5", "No" => "4", "value" => "******"), ); echo "ソート前"; echo "<pre>"; print_r($arr); echo "</pre>"; qsort($arr, 0, count($val)-1, $flag = "No"); echo "ソート後"; echo "<pre>"; print_r($arr); echo "</pre>\n<hr />"; /* * クイックソート * $int_array = ソートする配列 * $left = 開始位置(0で決め打ち) * $right = 終了位置($int_arrayの要素数:決め打ち) * $flag = ソート対象の配列要素 * $order = ソートの昇順(ASC)・降順(DESC) デフォルトは昇順 */ function swap(&$v, $i, $j) { $temp = $v[$i]; $v[$i] = $v[$j]; $v[$j] = $temp; } function qsort(&$int_array, $left = 0, $right, $flag = "", $order = "ASC") { if ($left >= $right) { return; } swap ($int_array, $left, intval(($left+$right)/2)); $last = $left; for ($i = $left + 1; $i <= $right; $i++) { if($flag) { if($order=="DESC") { if ($int_array[$i]["".$flag.""] > $int_array[$left]["".$flag.""]) { swap($int_array, ++$last, $i); } } else { if ($int_array[$i]["".$flag.""] < $int_array[$left]["".$flag.""]) { swap($int_array, ++$last, $i); } } } else { if($order=="DESC") { if ($int_array[$i] > $int_array[$left]) { swap($int_array, ++$last, $i); } } else { if ($int_array[$i] < $int_array[$left]) { swap($int_array, ++$last, $i); } } } } swap($int_array, $left, $last); qsort($int_array, $left, $last-1, $flag = $flag, $order = $order); qsort($int_array, $last+1, $right, $flag = $flag, $order = $order); } ?>
まぁ、落ちてたソースを多次元配列に対応させただけですけどね。
とりあえず関数であっても邪魔にはならないので、最近作るWebには大体入れてます。