plasmasphere.net -プラズマスフィア ドットネット-
Diary
PHPでバブルソート
2006/10/05(Thu) 00:10
PHPのソート関数が無いかと探していたら、特に無かったのでバブルソート(Bubble Sort)をJava版からPHPに改変してみました。
rsortとか使えば同じ動作するんで別にいらないんですが…。
ところがどっこい、二次元配列のイチ要素に対してソートを実行しようとすると、そうもいかなかったわけで。
例えば…
Array
(
[0] => 12
[1] => 50
[2] => 20
[3] => 1574
[4] => 67
[5] => 54
[6] => 2
[7] => 35
[8] => 21
)
みたいな配列は普通にrsort使えば問題ないんですが…
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] => ******
)
)
みたいな配列をNo要素順にソートしようとするとうまくいかない。
いや、俺が間違ってるだけかもしれんが。
というわけでソース。
<?php
$val = array(12,50,20,1574,67,54,2,35,21);
echo "ソート前";
echo "<pre>";
print_r($val);
echo "</pre>";
bsort($val);
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>";
bsort($arr, $flag = "No");
echo "ソート後";
echo "<pre>";
print_r($arr);
echo "</pre>\n<hr />";
/*
* バブルソート
* $val = ソートする配列
* $flag = ソート対象の配列要素
* $order = ソートの昇順・降順 デフォルトは昇順
*/
function bsort(&$val, $flag = "", $order = "ASC") {
for($i=0;$i<count($val)-1;$i++){
for($j=count($val)-1;$j>i;$j--){
if($flag) {
if($order=="DESC") {
if($val[$j]["".$flag.""]>$val[$j-1]["".$flag.""]){
$t=$val[$j];
$val[$j]=$val[$j-1];
$val[$j-1]=$t;
}
} else {
if($val[$j]["".$flag.""]<$val[$j-1]["".$flag.""]){
$t=$val[$j];
$val[$j]=$val[$j-1];
$val[$j-1]=$t;
}
}
} else {
if($order=="DESC") {
if($val[$j]>$val[$j-1]){
$t=$val[$j];
$val[$j]=$val[$j-1];
$val[$j-1]=$t;
}
} else {
if($val[$j]<$val[$j-1]){
$t=$val[$j];
$val[$j]=$val[$j-1];
$val[$j-1]=$t;
}
}
}
}
}
}
?>
単純なバブルソート。
要素が30を超えてくると、動作がぬるぬるしだす辺りはやっぱりバブルソートだなぁ…と。
クイックソートはまた明日にでも。
