Javaバブルソートアルゴリズム(詳細手順説明と実装コード付)


前言
バブルソートアルゴリズムは左から右に、2つのデータのサイズを順に(小さいものから大きいものに並べたい場合)、前のものが後のものより大きい場合は位置を交換します.1サイクルごとに、そのサイクルで遭遇する最大の数を一番後ろに並べます.配列長がlengthであると仮定すると、length-1ラウンドだけをループしてその配列を小さいものから大きいものに並べることができます.
バブルソートプロセス
配列int[]arr=new int[]{3,4,1,2,0}を仮定する.
第1ラウンドの遍歴:

交換前:
3
4
1
2
0


交換後:(3<4のため位置は交換しない)
3
4
1
2
0

交換前:
3
4
1
2
0


交換後:(1<4のため位置交換)
3
1
4
2
0

交換前:
3
1
4
2
0


交換後:(2<4のため位置交換)
3
1
2
4
0

交換前:
3
1
2
4
0


交換後:(0<4のため位置交換)
3
1
2
0
4
第1ラウンドの交換が終了し、そのラウンドが遭遇した最大の数字4は、すでに最も後ろに並んでおり、4はこの配列の中で最大の数であり、このラウンドはすべてのデータを遍歴したためである.
第2ラウンド遍歴:

交換前:
3
1
2
0
4


交換後:(1<3のため位置交換)
1
3
2
0
4

交換前:
1
3
2
0
4


交換後:(2<3のため位置交換)
1
2
3
0
4

交換前:
1
2
3
0
4


交換後:(0<3のため位置交換)
1
2
0
3
4
4はすでに最大の数字なので、ここでは4回目の交換は必要ありません.同時に2回目の遍歴配列は2番目に大きい数を見つけ、最後から2番目の位置に並べます.
第3ラウンド遍歴

交換前:
1
2
0
3
4


交換後:(1<2のため位置は交換しない)
1
2
0
3
4

交換前:
1
2
0
3
4


交換後:(0<2のため位置交換)
1
0
2
3
4
3はこの輪の2番目に大きい数字であるため、ここでは3番目の輪の交換を必要とせず、3番目の遍歴はこの配列の3番目に大きい数を探し出し、それを逆3の位置に置いた.
第4ラウンド遍歴

交換前:
1
0
2
3
4


交換後:(0<1のため位置交換)
0
1
2
3
4
2はこの配列の3番目に大きい数字であるため,ここでは2回目の交換は必要ない.これで、バブルソートが終了し、最終配列はソートが完了し、小さいから大きいまでソートされます.
法則の総括
この配列の長さは5で合計4回の1回目の遍歴:4回目の交換回数2回目の遍歴:3回目の交換回数3回目の遍歴:2回目の交換回数4回目の遍歴:1回目の交換回数ソートが終了した.
この法則は、配列長:length 1で行う必要がある:length-1ラウンドループをforループに変換する:(i=0,1,2,...,length-2)、共にlength-1回ループする
for(int i = 0;i < length - 1;i++){
}

②第iラウンド遍歴に必要な交換回数は、length-1-i;(iの初期値は0)forループに変換すると、(j=0,1,2,...,length-2-i)
for(int j = 0;j < length - 1 - i;j++){
}

②のループ回数は①の影響を受けるため、②ループは①内にネストすべきであり、具体的な実装コードは以下の通りである.
サンプルコード
public class BubbleSort {
	public static void main(String[] args) {
		int[] arr = new int[] {12,2,84,65,-51,57,85,11,54,-12};
		
		int temp = 0;
		
		for(int i = 0;i < arr.length - 1;i++) {//      
			
			for(int j = 0;j < arr.length - 1 - i;j++) {// i        
				if(arr[j] > arr[j + 1]) {
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
		//     
		for(int i = 0;i < arr.length;i++) {
			System.out.print(arr[i] + " ");
		}
	}
}