blog

アルゴリズムを学ぶ:ソート - 選択ソート

選択ソートとは、配列から最大または最小の要素を選択し、それをキューの先頭または末尾の要素と相互作用させる処理です。 最初に選択処理が行われるので、選択ソートと呼ばれています。 8個の数字がある場合、7...

Dec 13, 2020 · 3 min. read
シェア

簡単

選択ソートは、配列から最大または最小の要素を選択し、キューの先頭または末尾の要素と相互作用させるプロセスです。

セレクション・ソートと呼ばれるのは、最初に行われるのがセレクション・プロセスだからです。

選択ソートの例

29,10,14,37,20,25,44,15という配列があった場合、どのように選択的にソートしますか?

アニメーションから始めましょう:

選別の原理は以下の通り:

8つの数字がある場合、7ラウンドの並べ替えが必要です。

例えば、最初のラウンドでは、ペアはすべてのデータを比較し、10の中で最も小さいものを見つけ、その10を配列の最初に入れます。

2巡目になると、配列の最初の要素である10はすでにソートされているので、2番目の位置から始めればよく、同様に2巡目では、次の要素の中で最も小さい14を見つけ、配列の2番目の位置に配置します。

7回にわたる類推による選別で、最終的な結果が出ました。

選択ソートJavaコードの実装

上記のロジックをJavaコードで実装すると以下のようになります:

public class SelectionSort {
 public void doSelectionSort(int[] array){
 log.info("ソート前の配列は次のようになる。:{}",array);
 //すべてのラウンドを反復する外側ループ
 for(int i=0; i< array.length-1; i++){
 //内側ループで最小数を求める
 int minIndex=i;
 for(int j=i+1;j<array.length;j++)
 {
 if(array[j] < array[minIndex])
 {
 minIndex = j;
 }
 }
 //各選択の後、minIndexがある要素とi番目の要素を入れ替える。
 int temp = array[minIndex];
 array[minIndex] = array[i];
 array[i] = temp;
 log.info("第{}ラウンドソート後の配列は次のようになる。:{}", i+1, array);
 }
 }
 public static void main(String[] args) {
 int[] array= {29,10,14,37,20,25,44,15};
 SelectionSort selectionSort=new SelectionSort();
 selectionSort.doSelectionSort(array);
 }
}

走行結果

選択的ソートの2番目のJava実装

上記のコードでは、最小の要素が毎回ルックアップされ、同様に最大の要素をルックアップすることができます。

public class SelectionSort1 {
 public void doSelectionSort(int[] array){
 log.info("ソート前の配列は次のようになる。:{}",array);
 //すべてのラウンドを反復する外側ループ
 for(int i=0; i< array.length-1; i++){
 //内部ループで最大の数を求める
 int maxIndex=0;
 for(int j=0;j<array.length-i;j++)
 {
 if(array[j] > array[maxIndex])
 {
 maxIndex = j;
 }
 }
 //各選択の後、maxIndexが位置する要素と長さ-i-1要素交換
 int temp = array[array.length-i-1];
 array[array.length-i-1] = array[maxIndex];
 array[maxIndex] = temp;
 log.info("第{}ラウンドソート後の配列は次のようになる。:{}", i+1, array);
 }
 }
 public static void main(String[] args) {
 int[] array= {29,10,14,37,20,25,44,15};
 SelectionSort1 selectionSort=new SelectionSort1();
 selectionSort.doSelectionSort(array);
 }
}

走行結果

どちらのソートでも、内部ループの比較条件が異なることに注意する必要があります。

選択ソートの時間複雑性

選択ソートもバブルソートと同様にn*n回のループを必要とするので、その時間複雑度はO(n²)となります。

この記事のコードアドレス

学習アルゴリズム

この記事は www.flydean.com/algorithm-s...

最も人気のある説明、最も深く辛口で簡潔なチュートリアル、そしてあなたが知らなかった数々のヒントが、あなたの発見を待っています!

Read next

console.table()でJavaScriptの高度なデバッグを行う

()による配列データのログ\nプログラミング言語とそのファイル拡張子のテーブルを作成したとします:\nvar languages = [\n { name: "", fileEx

Dec 13, 2020 · 3 min read