バブルソート
右隣の値と比較して大きい方を右に入れ替える。
これを何セットかループさせると値の昇順になる。
例: {34, 20, 10, 6} という配列を昇順に並べたいとき、
【1セット目】
・比較1回目:配列0番目と1番目比較→34の方が大きい→ {20, 34, 10, 6}
・比較2回目:配列1番目と2番目比較→34の方が大きい→ {20, 10, 34, 6}
・比較3回目:配列2番目と3番目比較→34の方が大きい→ {20, 10, 6, 34}
【2セット目】
・比較1回目:配列0番目と1番目比較→20の方が大きい→ {10, 20, 6, 34}
・比較2回目:配列1番目と2番目比較→20の方が大きい→ {10, 6, 20, 34}
※配列2番目と3番目の比較はする必要ない!
なぜなら、1セット目で一番大きい値をセットしたため、3番目の方が大きいという答えはもう出ている。比較しても絶対に入れ替えは発生しない。
【3セット目】
・比較1回目:配列0番目と1番目比較→10の方が大きい→ {6, 10, 20, 34}
※こちらも同様で、1~2セット目で大きい値をセットした文との比較は必要ない。
よってここで終了。
といった流れで昇順ソートができる。
これをコードに当てはめると…
// 何かしらの配列
int[] array = {};
for (int i = 0; i < array.length - 1; i++){
for (int j = 0; j < array.length - (i + 1); j++) {
if (array[j] > array[j + 1]) {
// array[j]とarray[j+1]を入れ替える処理
}
}
}
この外側のforは「セット数」
配列の要素数(length) -1 回
for (int i = 0; i < array.length - 1; i++){
内側のforは「比較回数」
配列の要素数(length) - その時のセット数(可変していくiは0始まりのため+1で辻褄合わせ)
for (int j = 0; j < array.length - (i + 1); j++) {
フィッシャーイェーツ
数字をランダムに並べ替えたいとき。
※雑ですが取り急ぎのメモ。
import java.util.Arrays;
import java.util.Random;
public class Fukusyu4 {
public static void main (String[] args) {
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Random random = new Random();
//要素数の大きいインデックスから順にカウントダウン(10個目→9個目・・・)
//長さ(要素数)は10個だが、配列番号(インデックス)は0から始まるため、辻褄を合わせるために-1する。
//このi は、配列のインデックス数を指定するために使う!
for (int i = numbers.length -1; i > 0; i --) {
//0からi+1(この場合10)までのランダムな整数を生成。要素が0始まりだから+1
//random.nextInt(値) ⇒指定した値未満の範囲でランダムな整数を生成
int rNum = random.nextInt(i + 1);
//tempに選択中の要素(インデックス大きい順)を退避
int temp = numbers[i];
//元の場所(右端)に、ランダム生成された要素番号の数字を格納
numbers[i] = numbers[rNum];
//入れ替え
numbers[rNum] = temp;
}
System.out.println("シャッフル後: " + Arrays.toString(numbers));
}
}