今回はバブルソートのアルゴリズムについて、JavaScript でコードをみていきたいと思います。
バブルソートとは
まずソートとはデータを並べ替えることをいい、バブルソートとは、(昇順の場合)隣のデータと順々に比較し、大きい方を右に並べ替えるという方法のソートになります。
たとえば、
4,2,5,1,3
とランダムに並んだデータを
1,2,3,4,5
のように昇順に並べ替える場合、
4,2,5,1,3
↓
2,4,5,1,3
↓
2,4,5,1,3
↓
2,4,1,5,3
↓
2,4,1,3,5
これで最大値が一番右に移動したので、ソート済みにし、残りに対して同じ処理を繰り返します。
2,4,1,3 5
↓
2,4,1,3
↓
2,1,4,3
↓
2,1,3,4
2,1,3 4,5
↓
1,2,3
↓
1,2,3
1,2 3,4,5
↓
1,2,3,4,5
実装
let nums = [4,2,5,1,3];//これをバブルソートする
for (let i = nums.length; i > 1 ; i--) {
for (let j = 0; j < i; j++) {
if (nums[j] > nums[j+1]) {
let temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
console.log(nums);//[1,2,3,4,5]と表示
解説
最初の for 文は、最大値をひとつずつ調べるためのものです。
for (let i = nums.length; i > 1 ; i--) {
...
}
次の for 文と if 文でデータをひとつずつ比較していき、配列の最後に最大値が移動します。
for (let j = 0; j < i; j++) {
if (nums[j] > nums[j+1]) {
let temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
そして最初の for 文にもどり、同じ処理を繰り返してソートを行います。
これでもバブルソートは実装できますが、もう少し処理が速くなるよう書き換えることができます。
たとえば極端な例ですが、1,2,3,4,5,6,7,9,8を並び替えるとします。
8と9を入れ替えるだけですべて昇順に並ぶので、その時点で処理を終えてもいいのですが、プログラムは隣同士の比較を最後まで続けてしまいます。
途中ですべて昇順に並んだらプログラムを終了するよう実装するには、以下のように書き加えます。
let nums = [1,2,3,4,5,6,7,9,8];//これを選択ソートする
for (let i = nums.length; i > 1 ; i--) {
let notChanged = true;
for (let j = 0; j < i; j++) {
if (nums[j] > nums[j+1]) {
let temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
notChanged = false;
}
}
if (notChanged) {
break;
}
}
console.log(nums);//[1,2,3,4,5,6,7,8,9]と表示
notChanged 変数は、順番の変更があったかどうかを管理します。
if (nums[j] > nums[j+1])
が true のとき、つまり順番の変更があるときは notChanged を false にし、
変更がなかったときは、
if (notChanged) {
break;
}
とすることで、最初の for 文を強制的に終了させています。
参考書
コメント