blog

バブルソートと選択ソート

要素の配列は、比較する左端とその右の要素を取り、左が大きい場合は、位置を交換し、右が大きい場合は、交換しないでください;そして、比較する2番目の要素と3番目の要素を取り、2番目の大きい場合は、位置を交...

Dec 24, 2020 · 5 min. read
シェア

バブルソート

要素の配列で、一番左の要素と右の要素を比較し、左の方が大きければ位置を交換し、右の方が大きければ交換しません。

例えば、配列 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])の最小値の仮定に左手、そして今、左手は空であり、その後、左手にテーブルを置くように、位置の交換が達成されるように。今、左手は空であり、その後、位置の交換が達成されるように、左手にテーブルを置きます。

Read next

要素選択ドロップダウン・ボックスの単一選択と複数選択の切り替えは、このバグが原因である。

最近、Elementuiコンポーネントを使用した管理背景を書いています。検索セクションでは、異なるタイプの作業指示書に従って、次の検索オプションを動的に切り替える必要があります。 作業指示の種類を切り替え続けると、エラーが発生します。エラーは以下のようなものです。 この外観はelementui内部エラーであるああ、私はインターネット検索に行き、その後見て...

Dec 24, 2020 · 2 min read