バブルソート
要素の配列で、一番左の要素と右の要素を比較し、左の方が大きければ位置を交換し、右の方が大きければ交換しません。
例えば、配列 int[] arr = {6,1,2,8,0,7} です;
第1サイクル
比較対象データ:6 1 2 8 0 7(6と1の比較、6と1の順位交換)
最初の比較の結果: 1 6 2 8 0 7(6と2が比較され、6>2、6と2が順位交換)
番目の比較結果: 1 2 6 8 0 7 (6と8を比較し、6<8、順位は入れ替えず)
3つ目の比較の結果: 1 2 6 8 0 7 (8と0の比較、8>0、8と0の交換ポジション)
第4比較の結果:1 2 6 0 8 7(8と7を比較、8>7、8と7は順位交換)
第5比較の結果: 1 2 6 0 7 8
2サイクル目。
比較対象データ:1 2 6 0 7(1と2の比較、1<2、ポジション交換なし)
最初の比較の結果: 1 2 6 0 7 (2と6の比較、2<6、ポジション交換なし)
2回目の比較結果: 1 2 0 6 7 (6と0の比較、6>0、6と0の交換位置)
3回目の比較結果: 1 2 0 6 7 (6と7の比較、6<7、ポジション交換なし)
第4回比較の結果: 1 2 0 6 7
第3サイクル
比較対象データ:1 2 0 6(1と2の比較、1<2、ポジション交換なし)
最初の比較の結果: 1 2 0 6 (2 と 0 の比較、2 > 0、2 と 0 の交換ポジション)
2回目の比較結果: 1 0 2 6 (2と6を比較し、2<6、順位は入れ替えず)
第3比較の結果: 1 0 2 6
第4サイクル
比較対象データ:1 0 2(1と0の比較、1>0、1と0の交換ポジション)
最初の比較の結果:0 1 2(1と2の比較、1<2、ポジション交換なし)
2回目の比較結果: 0 1 2
第5サイクル
比較対象データ:0 1(0と1の比較、0<1、交換なし)
最初の比較結果: 0 1
if(arr[i] > arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
6データ、外側ループは5回、内側ループはそれぞれ5,4,3,2,1回です。
arrの長さは6で、iは0,0,1,2,3,4,5の外側ループから始まります。
逆に考えると、forループでは、外側のループはi--;で、5から1へ、これも5回来ますが、内側のループのjは、i=5の時は0から4へ(5回)、i=4の時は0から3へ(4回)、i=1の時はj=0(1回)、つまり
for(int i = 5; i > 0; i--){//実際には5がarr.length - 1
for(int j = 0; j < i; j++){
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
このソート方法では、比較回数は15回、交換回数は7回です。
選択ソート
毎回、比較するデータの配列の中で最小の値を見つけ、この最小の値を取り、配列の最初のデータと交換します。
例えば、配列 int[] arr = {6,1,2,8,0,7} です;
比較対象データ:6 1 2 8 0 7(最小値は0、6、0交換ポジション)
最初のループ:結果を比較:1 2 8 6 7(それは最小であるため、関係なく0、最小値が1の後、位置を交換しないでください)
2番目のループ:結果を比較:2 8 6 7(0、1に関係なく、それが最小であるため、後ろの最小値は2であり、位置を交換しないでください)
3つ目のループ:結果を比較:8 6 7(0、1、2は、それが最小であるため、気にしない、最小値は6、8と6の交換位置の後)
4番目のループ:比較後の結果:8 7(0,1,2,6は関係ありません、それは最小であるため、最小値は7、8と7の交換位置です)
第5ループ:比較後の結果:8
6データ、外側ループ5回、内側ループ5,4,3,2,1回。
<8,arr[1]还是最小的,arr[1]和arr[4]比较,1>arr[0]が最小と仮定し、i=0,arr[0]とarr[1]を比較,6>1,arr[0]は最小でない,arr[1]に最小値を代入,arr[1]とarr[2]を比較,1<2,arr[1]はまだ最小,arr[1]とarr[3]を比較,1 0,arr[1]は最小でない.arr[4]に最小値を代入し、arr[4]とarr[5]を比較すると、0<7なので、最小値はarr[4]です。そして、arr[4]とarr[0]を入れ替えます。最初のループが終了します。arr[0]の位置が現在の最小値です。つまり、1, 2, 8, 6, 7です。
i=1の時、仮の最小値はarr[1],arr[1],arr[2] compare,1<2,arr[1]はまだ最小,arr[1],arr[3] compare,1<8,arr[1]はまだ最小,arr[1],arr[4] compare,1<6,arr[1]はまだ最小,arr[1],arr[5比較,1<7,arr[1]は最小値のまま,arr[1]とarr[5] 比較,1<7,arr[1]は最小値のまま,arr[1]とarr[52回目のループが終了します。arr[1]の位置が現在の最小値です。つまり、2 8 6 7 であり、もはや比較には関係ありません。
arr[2]とarr[3]のcompare,2<8,arr[2]は最小のまま,arr[2]とarr[4]のcompare,2<6,arr[2]は最小のまま,arr[2]とarr[5]のcompare,2<7,arr[2]は最小のままです。位置を交換する必要はありません。3回目のループが終了します。arr[2]の位置は現在の最小値です。つまり、8 6 7です。
arr[4]に最小値を代入し、arr[4]とarr[5]を比較し、arr[4]とarr[5]を比較し、arr[4]とarr[4]を比較し、arr[4]とarr[3]を比較し、arr[4]とarr[3]を比較します。4回目のループが終了します。この時点でarr[3]の位置が現在の最小値です。つまり、8 7.はもはや比較に関与していません。
i=4の時、仮の最小値はarr[4]、arr[4]とarr[5]を比較、8>7の時、arr[4]が最小でないので、最小値をarr[5]に代入、arr[4]とarr[5]は位置を交換。5回目のループが終了します。arr[4]の位置が現在の最小値です。つまり8です。
上記で、外側のループがiの時、iの値を最小値minの添え字に代入し、arr[min]とarr[i+1]を比較させ、arr[i+1]< />の時
iの値が変わらないときは、arr[0]とarr[1]の比較しかできず、arr[0]からarr[5]までのループはできません。一方、i=1のときは、arr[1]からarr[5]までのループ...。i=4のときはarr[4]からarr[5]までループします。
内部ループには変数j=i+1;j< />が必要です。
for(int i = 0; i < arr.length - 1; i++){
int min = i;
for(int j = i + 1; j < arr.length; j++){
if(arr[j] < arr[min]){
min = j;
}
}
if(min != i){
int temp;
temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
交換位置はよく理解されていませんが、何かを持つ両手として想像することができ、左手は6(arr[i])、最小値の仮定を保持し、右手は0(arr[min])の最小値を保持し、今、intのtempは、テーブルのように、テーブルへの最初の最小値、そして今、右手は空であり、その後、右手に6(arr[i])の最小値の仮定に左手、そして今、左手は空であり、その後、右手に6(arr[i])の最小値の仮定に左手、そして今、左手は空であり、その後、左手にテーブルを置くように、位置の交換が達成されるように。今、左手は空であり、その後、位置の交換が達成されるように、左手にテーブルを置きます。