この記事を書いた理由
ソート関数を使わずに配列の要素を昇順、または降順に並べ替える関数をつくる際、
「バブルソート関数」というロジックがとてもクレバーだったので備忘録として残しておく。
コード
main.php
<?php
$arr = [5,6,1,2];
function customSort($arr){
for($n = 0; $n < count($arr)-1; $n++) {
for($i = 0; $i < count($arr)-1; $i++) {
if($arr[$i] < $arr[$i+1]) {
$tmp = $arr[$i+1];
$arr[$i+1] = $arr[$i];
$arr[$i] = $tmp;
}
}
}
return $arr;
}
$arr2 = customSort($arr);
var_dump($arr2);
//[1,2,5,6];
?>
解説
全ての要素に関して、隣接する要素と比較し順序が逆であれば入れ替える。これを要素数-1回繰り返すことでソートを行う。なおこの繰り返しは、入れ替えが起こらなくなった時点で(それ以降は何度繰り返しても変化が起こらなくなるので)中断することができる。(Wikipediaより)
main.php
if($arr[$i] < $arr[$i+1]) {
$tmp = $arr[$i+1];
$arr[$i+1] = $arr[$i];
$arr[$i] = $tmp;
}
for文の中で実行されている要素とその次の要素と比較して順番が逆だった場合、
$tmpという変数にその次の要素を格納する。
3行目の$arr[$i+1]の配列インデックスが$iになり、
$arr[$i]が$tmpに格納されていた$arr[$i+1]になるため、
要素の順番の入れ替えが実現できる。
補足
wikipediaにバブルソートのアルゴリズムを視覚的に表した図がめちゃめちゃ分かりやすいのでリンクを貼っておきます。
バブルソート出典: フリー百科事典『ウィキペディア(Wikipedia)』