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要素順にソートしようとするとうまくいかない。
いや、俺が間違ってるだけかもしれんが。

というわけでソース。

bsort.php

<?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を超えてくると、動作がぬるぬるしだす辺りはやっぱりバブルソートだなぁ…と。
クイックソートはまた明日にでも。

参考:いろいろなソートアルゴリズム


似てるっぽいネタ


 
© 1999- plasmasphere.net All rights reserved.