概要
応用情報の問題を解いている時にバブルソートの問題を見つけたので、それをプログラムで書いてみました。
バブルソートとは?
隣り合う数字を比較し、昇順の場合は左側の数字が大きければ順番を入れ替えます。降順の場合は右側の数字が大きければ順番を入れ替えます。
応用情報問題 https://www.ap-siken.com/s/kakomon/04_aki/q6.html
完成コード
<?php
$a = ["2", "1", "0"];
for($i = 0; $i <= count($a) - 1 ; $i++){
for($j = count($a) - 1 ; $j >= $i + 1 ; $j--){
if($a[$j] < $a[$j - 1]){
$w = $a[$j];
$a[$j] = $a[$j - 1];
$a[$j - 1] = $w;
}
}
echo $a[$i];
}
?>
配列はarrayでも上記のような書き方でも可です。
応用情報では大文字のAですが、こちらは小文字で書いてます。特に意味はありません。
解説
<?php
$a = ["2", "1", "0"];
for($i = 0; $i <= count($a) - 1 ; $i++){
for($j = count($a) - 1 ; $j >= $i + 1 ; $j--){
今回の問題の
初期値0、増分1、終値n-1
ここのnは配列の要素数を表しています。
それぞれiとjに割り当てています。
for文のiは要素数を割り当てます。
もちろんプログラムなので0からです。
配列に値を入れると0=>[2]、1=>[1]、2=>[0]となります
jは要素数を表す変数であり、初期値はn、増分は-1、終値はi+1となります。
if文
if($a[$j] < $a[$j - 1]){
$w = $a[$j];
$a[$j] = $a[$j - 1];
$a[$j - 1] = $w;
}
if文で順番を変えるコードを書きます。
プログラムは人間みたいに、すぐに順番を変えることができません。
一度別の変数に値を入れておく必要があります。
仮に
$j = 1とします
今回は$wに $a[$j]
を挿入します。
$jが1で、$a[1]になるので、
$a[$j] = 1です。
こちらは$a[0]なので
$a[$j - 1]= 2です。
if文の右側をすべて数字にすると
$w = 1;
$a[$j] = 2
$a[$j - 1] = 1
こうなります。
逆になりました。
これでaの中身が上書きされます。
それで順番通りになるわけです。
結論
ムズイ!でも理解できれば楽しいですね。
この問題を理解するのに1日費やしましたが、いい経験でした。
間違ってたらごめんなさい!