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には大体入れてます。
