🎯
【Java】バブルソート
バブルソートとは
バブルソートとは、隣接する要素を比較し、必要に応じて交換を行いながら、データの並び替えを行うソートアルゴリズムです。
挿入ソート及び選択ソートと同様に、バブルソートも非効率的なアルゴリズムであり、要素数が多くなってしまうと処理が遅くなりがちです。
問題の内容と回答の方針等
- 問題
- サイズ
n
の数列a
をバブルソートせよ。
- サイズ
- 条件
- 配列
a[]
のインデックスが大きい方から隣接する要素を比較し、値が小さい方を配列の左に移動させることとする。
- 配列
- 解答方針
- 数列
a
を配列a[]
で管理します。 - 外側の
for
文でn-1
回のループを回します。 -
i
回目ではa[n-1]
から順にa[i]
まで比較していきます。但し、i
の初期値は0
とします。 - 内側の
for
文で変数j
のn-1
からi+1
までのループを回し、a[j-1] > a[j]
なら、a[j-1]
とa[j]
を交換します。
- 数列
- 今回の入力値
上からn
、a
とする。4 8 1 3 2
バブルソートのコード例
import java.util.*;
public class Main {
static void print(int[] a, int n) {
for (int i = 0; i < n; i++) {
if (i > 0)
System.out.print(" ");
System.out.print(a[i]);
}
System.out.println();
}
static void bubbleSort(int[] a, int n) {
// n-1回ループする外側のfor文
for (int i = 0; i < n - 1; i++) {
// jがn-1からi+1までループする内側のfor文
for (int j = n - 1; j > i; j--) {
// a[j-1] > a[j]なら
if (a[j - 1] > a[j]) {
// a[j-1]とa[j]を交換する
int temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
print(a, n);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
bubbleSort(a, n);
}
}
バブルソートアルゴリズムの解説
バブルソートアルゴリズムに該当する下記の部分のみを解説します。
static void bubbleSort(int[] a, int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = n - 1; j > i; j--) {
if (a[j - 1] > a[j]) {
int temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
print(a, n);
}
}
仮引数は下記の通りです。
a = [8, 1, 3, 2]
n = 4
i = 0 の場合
- 外側の
for
文の条件式i=0 < n-1=3
を満たすので、 - 内側の
for
文の条件式j=3 > i=0
を満たすので、 -
if
文の条件式a[2]=3 > a[3]=2
を満たすので、 - 変数
temp
にa[3]
の2
を代入します。 -
a[3]
にa[2]
の3
を代入します。 -
a[2]
に変数temp
の2
を代入します。
この時の配列aは下記の通りになります。a = [8, 1, 2, 3]
-
j
を1減らして、内側のfor
文の条件式j=2 > i=0
を満たすので、 -
if
文の条件式a[1]=1 > a[2]=2
を満たさないので、if
文を抜けます。 -
j
を1減らして、内側のfor
文の条件式j=1 > i=0
を満たすので、 -
if
文の条件式a[0]=8 > a[1]=1
を満たすので、 - 変数
temp
にa[1]
の1
を代入します。 -
a[1]
にa[0]
の8
を代入します。 -
a[0]
に変数temp
の1
を代入します。 - この時の配列aは下記の通りになります。
a = [1, 8, 2, 3]
-
j
を1減らして、内側のfor
文の条件式j=0 > i=0
を満たさないので、内側のfor
文を抜けます。 -
print
メソッドを呼び出し、実引数として配列a
と変数n
を渡します。
i = 1 の場合
- 外側の
for
文の条件式i=1 < n-1=3
を満たすので、 - 内側の
for
文の条件式j=3 > i=1
を満たすので、 -
if
文の条件式a[2]=2 > a[3]=3
を満たさないので、if
文を抜けます。 -
j
を1減らして、内側のfor
文の条件式j=2 > i=1
を満たすので、 -
if
文の条件式a[1]=8 > a[2]=2
を満たすので、 - 変数
temp
にa[2]
の2
を代入します。 -
a[2]
にa[1]
の8
を代入します。 -
a[1]
に変数temp
の2
を代入します。
この時の配列aは下記の通りになります。a = [1, 2, 8, 3]
-
j
を1減らして、内側のfor
文の条件式j=1 > i=1
を満たさないので、内側のfor
文を抜けます。 -
print
メソッドを呼び出し、実引数として配列a
と変数n
を渡します。
i = 2 の場合
- 外側の
for
文の条件式i=2 < n-1=3
を満たすので、 - 内側の
for
文の条件式j=3 > i=2
を満たすので、 -
if
文の条件式a[2]=8 > a[3]=3
を満たすので、 - 変数
temp
にa[3]
の3
を代入します。 -
a[3]
にa[2]
の8
を代入します。 -
a[2]
に変数temp
の3
を代入します。
この時の配列aは下記の通りになります。a = [1, 2, 3, 8]
-
j
を1減らして、内側のfor
文の条件式j=2 > i=2
を満たさないので、内側のfor
文を抜けます。 -
print
メソッドを呼び出し、実引数として配列a
と変数n
を渡します。
Discussion