一目でわかるアルゴリズム「選択ソート」

一目でわかるアルゴリズム「選択ソート」

「選択ソート」は実際の応用では「挿入ソート」ほど広範囲ではありませんが、ソートアルゴリズムの研究には欠かせないものでもあります。バブルソートと挿入ソートはどちらも、2 つのネストされたループ内の要素をゆっくりと比較し、要素の位置を継続的に調整します。 「選択ソート」はより直接的です。移動しない場合は何もする必要はありません。ただし、移動を行った後は、対応する要素が所定の位置に配置されている必要があり、要素の位置は変更されません。

[[320109]]

そのロジックを詳しく見てみましょう。

1. 選択ソートとは何ですか?

選択ソートも非常に単純なソートアルゴリズムです。ソートするデータのセットを 2 つのセグメントに分割し、1 つは「ソート済み」データ、もう 1 つは「ソートされていない」データにします。もちろん、最初は「ソート済み」セクションにデータはありません。ソートが開始されると、そのたびに「ソートされていない」データから最小の要素が取り出され(ここで最小の要素が取り出される点が「挿入ソート」と異なることに注意してください)、この最小の要素が「ソートされた」データの最後の要素の後に挿入されます(ここで実際に最小の要素は「ソートされた」データの末尾の次の要素と交換されます)。これにより、「ソートされた」データは常に順序付けされます。このプロセスは、すべての「未ソート」データが交換され、ソート全体が完了するまでループで繰り返されます。

以下に図付きの例を示します。

(インターネットからの写真)

上の図からわかるように、初期配列は

要素 29 72 98 13 87 66 52 51 36
添字 0 1 2 3 4 5 6 7 8

この配列を小さいものから大きいものの順に並べ替えるには、デフォルトの初期状態は完全に順序付けられていないため、この配列を走査して最小の要素を見つけ始めます。

1. 最初の大きなループで、配列全体で最小の要素「13」を見つけ、この最小の要素「13」を配列の先頭の要素「29」と交換します。スワップ後の配列は次のようになります。

要素 13 72 98 29 87 66 52 51 36
添字 0 1 2 3 4 5 6 7 8

2. 2 番目の大きなループでは、要素「13」は「ソート済み」セグメントに属し、残りのすべての要素は「未ソート」セグメントに属します。残りの要素から最小の要素「29」を見つけ、この最小の要素「29」を要素「72」と交換します (要素「72」はソートされた配列の次の要素であるため)。交換後の配列は次のようになります。

要素 13 29 98 72 87 66 52 51 36
添字 0 1 2 3 4 5 6 7 8

3. 3 番目の大きなループでは、要素「13」と「29」がすでに「ソート済み」セクションに存在し、残りの要素はすべて「未ソート」です。残りの要素から最小の要素「36」を見つけ、この最小の要素「36」を要素「98」と交換します (要素「98」はソートされた配列の次の要素であるため)。交換後の配列は次のようになります。

要素 13 29 36 72 87 66 52 51 98
添字 0 1 2 3 4 5 6 7 8

4. 4 番目の大きなループでは、すでに「ソート済み」セクションに要素「13」、「29」、「36」が存在し、残りの要素はすべて「未ソート」です。残りの要素から最小の要素「51」を見つけ、この最小の要素「51」を要素「72」と交換します (要素「72」はソートされた配列の次の要素であるため)。交換後の配列は次のようになります。

要素 13 29 36 51 87 66 52 72 98
添字 0 1 2 3 4 5 6 7 8

5. 5 番目の大きなループでは、すでに「ソート済み」セクションに要素「13」、「29」、「36」、および「51」が存在し、残りの要素はすべて「未ソート」です。残りの要素から最小の要素「52」を見つけ、この最小の要素「52」を要素「87」と交換します (要素「87」はソートされた配列の次の要素であるため)。交換後の配列は次のようになります。

要素 13 29 36 51 52 66 87 72 98
添字 0 1 2 3 4 5 6 7 8

6. 6 番目の大きなループでは、「ソート済み」セクションにすでに要素「13」、「29」、「36」、「51」、「52」があり、残りの要素はすべて「未ソート」です。残りの要素から最小の要素「66」を見つけ、この最小の要素「66」がすでにソートされた配列の次の要素であることがわかります。そのため、これを交換する必要はなく、配列は変更されません。

要素 13 29 36 51 52 66 87 72 98
添字 0 1 2 3 4 5 6 7 8

7. 7 番目の大きなループでは、すでに「ソート済み」セクションに要素「13」、「29」、「36」、「51」、「52」、および「66」が存在し、残りの要素はすべて「未ソート」です。残りの要素から最小の要素「72」を見つけ、この最小の要素「72」を要素「87」と交換します (要素「87」はソートされた配列の次の要素であるため)。交換後の配列は次のようになります。

要素 13 29 36 51 52 66 72 87 98
添字 0 1 2 3 4 5 6 7 8

8. 8 番目の大きなループでは、「ソート済み」セクションにすでに要素「13」、「29」、「36」、「51」、「52」、「66」、および「72」があり、残りの要素はすべて「未ソート」です。残りの要素から最小の要素「87」を見つけ、この最小の要素「87」がすでにソートされた配列の次の要素であることがわかります。そのため、これを交換する必要はなく、配列は変更されません。

要素 13 29 36 51 52 66 72 87 98
添字 0 1 2 3 4 5 6 7 8

9. 9 番目の大きなループでは、すでに「ソート済み」セクションに要素「13」、「29」、「36」、「51」、「52」、「66」、「72」、「87」があります。残っているソートされていない要素は「98」だけです。その位置は変更しないでください。つまり、この時点ですべてのソートが完了し、配列の最終状態は次のようになります。

要素 13 29 36 51 52 66 72 87 98
添字 0 1 2 3 4 5 6 7 8

選択ソートのコード図を見てみましょう。

アルゴリズムの質問: 配列 arr を小さいものから大きいものの順に並べ替えます。配列 arr は空ではなく、arr の長さは n であると仮定します。アイデア: 選択ソート法を使用する

  1. パブリックvoid 選択ソート ( int [] arr) {
  2. 整数i,j;
  3. int n = arr.length;
  4.      
  5. //各大きなループは残りの要素の最小値を見つけることができます
  6. (i=0; i<n; i++)の場合{
  7. // min変数は最小値のインデックスを格納するために使用されます。最初は、位置iが最小値であると仮定して、iは最初にminに割り当てられます。  
  8. 整数 最小値= i;
  9. //サブループは、i の最後の桁から始めて、その後ろのすべての要素を走査してサイズを比較するために使用されます。
  10. (j=i+1; j<n; j++)の場合{
  11. //最小ビットの値より小さい要素がある場合、この要素の添え字を最小に代入します 
  12. もしarr[j] < arr[ min ]であれば
  13. 最小値= j;
  14. }
  15. }
  16. // minがiと等しくない場合は、サブループで最小値が見つかったことを意味し、要素の位置を交換する必要があります。
  17. もしも(最小値!= i) {
  18. // swap メソッドは、配列内の 2 つの位置 (渡された配列と添え字) の値を交換するために使用されます。 swap メソッドは省略されています。
  19. swap(arr, min , i);
  20. }
  21. }
  22. }

2. 「選択ソート」のパフォーマンスはどの程度ですか?

前回の記事で説明したソートアルゴリズムの評価方法を使用して、「選択ソート」のパフォーマンス評価を実行します。

  • 時間の計算量:

選択ソートの原理は、2 つのネストされたループで比較と交換を行うことです。したがって、簡単に言えば、その時間計算量は一般に O(n*n) です。しかし、注意深く分析する場合には、具体的なデータに注目する必要があります。しかし、データの状況がどうであろうと、要素比較の数は同じなので、最良のケースでも最悪のケースでも、要素比較の数は同じです。次に要素交換の回数を見てみましょう。ソートするデータがすでに順序付けられている場合は、要素交換はまったく必要ないので、交換回数は 0 です。ただし、ソートするデータがすべて逆順になっている場合は、n-1 回の要素交換が必要になります。

したがって、最良、最悪、平均の選択ソートの時間計算量は O(n*n) です。

  • 空間の複雑さ:

選択ソートは、データの比較と交換が中心です。比較する要素の添え字を格納するための補助スペースのみが必要で、追加のスペースは消費しません。したがって、その空間計算量は O(1) です。

  • ソート安定性:

選択ソートアルゴリズムは安定したソートアルゴリズムではありません。安定性ソートの別の説明は次のとおりです。ソートの前後で 2 つの等しい要素の相対的な位置は一定のままです。

選択ソートが安定性ソートではないのはなぜでしょうか? たとえば、配列 6、7、6、2、8 では、最初にループされると、最初の位置にある 6 が、その後ろの 2 と入れ替わります。この時点で、2 つの 6 の相対的な前後の位置が変更されています。したがって、選択ソートは安定したソートアルゴリズムではありません。

  • アルゴリズムの複雑さ:

選択ソートアルゴリズムは、設計コンセプトやコード記述の面でも複雑ではなく、アルゴリズムの複雑さも比較的単純です。

上記は、データ構造における「選択ソート」についての考察です。ご質問はありますか?

書くのは簡単ではありません。気に入っていただけましたら、お友達に転送するか、記事の右下にある「読む」をクリックしてください。 😊

<<:  このプロジェクトはオープンソース化されています。Microsoft Research は転移学習を使用して、実用化に向けて自律型ドローンをトレーニングします。

>>:  ロボット警察がファンタジーを現実に変える

ブログ    
ブログ    

推薦する

AIが人種差別や性差別も学習したのはなぜでしょうか?

[[232177]]外見の偏見や言語の差別など、AI による差別についてはこれまでたくさん話してき...

これらの仕事は今後5年以内に機械に置き換えられる可能性があり、8500万人が解雇される危険にさらされている。

5G ネットワークの誕生と普及により、5G ネットワークのサポートにより、モノのインターネットの新...

LLM幻覚問題の徹底レビュー! HITチームの50ページのレビューが公開された

幻覚だよ、古い友人よ。 LLM が私たちの視野に入って以来、錯覚の問題は常に無数の開発者を悩ませてき...

ジェネレーティブAIがコンタクトセンターをどう変えるのか

新しいテクノロジーによって、コールセンターのエージェントと顧客とのやり取りの方法が変化したことを学び...

人工知能が将来経験する7つの段階

2030年までに、人工知能のおかげで世界のGDPは15.7兆ドル増加するでしょう。企業の 84% は...

...

大学入試結果が続々発表。ボランティア応募で人工知能が注目の選択肢に

今日から、全国各地の大学入試結果が続々と発表され、出願手続きが始まります。今年、各大学は、専門分野、...

韓信は本当に数学の達人なのでしょうか?古代中国の数学にヒントを得たコンピュータ暗号化アルゴリズム

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...

AI後の生活

人工知能は人類史上最も革命的な技術の一つとなるでしょう。 AI テクノロジーが発展するにつれて、どの...

百度副社長の尹世明氏:人工知能のプライバシー問題は技術で解決できる

[[260878]] 「当社は、個人データへのアクセスを必要としないマルチパーティデータコンピューテ...

...

Google、かわいい動物動画生成に優れたAI動画ジェネレータ「Lumiere」をリリース

海外メディアの報道によると、1月26日、GoogleはLumiereと呼ばれる人工知能ビデオジェネレ...

北科不動産はグラフ技術の導入を推進し、不動産サービスエコシステムの好循環を推進しています。

【51CTO.comオリジナル記事】 [[286886]]最近、北京グローバル金融センターで北科不...

人工知能トレーナーという職業は魅力的ですか?

人工知能については誰もが知っていますが、人工知能トレーナーについてはどのくらい知っていますか? [[...