プログラマーであれば、ソートについてすでによく聞いたことがあるはずです。並べ替えとは、基本的に要素を昇順または降順に並べることです。要素の並べ替えに使用できる並べ替えアルゴリズムは非常に多く、アルゴリズムごとに並べ替え方法や複雑さが異なります。したがって、どのアルゴリズムを使用するかは、特定のシナリオと要素の数によって異なります。挿入も一般的に使用される並べ替えアルゴリズムの 1 つで、複雑さは O(n^2) で、手の中のトランプを並べ替えるのと同じように実行されます。このトピックでは、Java の挿入ソートについて学習します。
無料ソフトウェア開発コースを始めましょう
Web 開発、プログラミング言語、ソフトウェア テスト、その他
例を使用して挿入ソートの仕組みを理解しましょう。
以下の要素を含む arr という名前の配列があるとします。
10 5 8 20 30 2 9 7
ステップ #1 – 挿入ソートは、それ自体で並べ替えられた配列の 1 番目の要素を考慮して、配列の 2 番目の要素、つまり 5 から始まります。ここで要素 5 は 10 と比較されます。5 は 10 未満であるため、10 は 1 つ前に移動され、その前に 5 が挿入されます。
結果の配列は次のようになります:
5 10 8 20 30 2 9 7
ステップ #2 – 要素 arr[2]、つまり 8 が要素 arr[1]、つまり 10 と比較されます。8 はその前の要素 10 より小さいため、1 つシフトされます。その位置から 1 つ先に進み、5 と比較されます。8 は 5 より大きいため、その後に挿入されます。
結果の配列は次のようになります:
5 8 10 20 30 2 9 7
ステップ #3 – 要素 20 は 10 より大きいため、10 と比較され、その位置に残ります。
5 8 10 20 30 2 9 7
ステップ #4 – 要素 30 は 20 と比較され、要素 30 は 20 より大きいため、変更は行われず、配列はそのまま残ります。配列は
になります。5 8 10 20 30 2 9 7
ステップ #5 – 要素 2 は 30 より小さいため 30 と比較され、1 つ前にシフトされてから 20、10、8、5 と 1 つずつ比較され、すべての要素が 1 つ前にシフトされ、2 が 5 の前に挿入されます。
結果の配列は次のとおりです:
2 5 8 10 20 30 9 7
ステップ #6 – 要素 9 は 30 より小さいため、30 と比較されます。 20、10と順番に比較され、要素が1つ前にシフトされ、10の前と8の後に9が挿入されます。
結果の配列は次のとおりです:
2 5 8 9 10 20 30 7
ステップ #7 – 要素 7 は 30 と比較され、要素 7 は 30 より小さいため、30、20、10、9、8 と比較され、すべての要素が 1 位置シフトされます。 1 つずつ前に進み、8 の前に 7 が挿入されます。
結果の配列は次のようになります:
2 5 7 8 9 10 20 30
このようにして、配列のすべての要素が挿入ソートを使用してソートされ、前の要素との比較が開始されます。
Java の挿入ソートは、すべての小さなデータ セットに適したシンプルなソート アルゴリズムです。
コード:
public class InsertionSort { public static void insertionSort(int arr[]) { for (int j = 1; j < arr.length; j++) { int key = arr[j]; int i = j-1; while ( (i > -1) && ( arr[i] > key ) ) { arr[i+1] = arr[i]; i--; } arr[i+1] = key; } } static void printArray(int arr[]) { int len = arr.length; //simple for loop to print the elements of sorted array for (int i= 0; i<len; i++) System.out.print(arr[i] + " " ); System.out.println(); } public static void main(String args[]){ int[] arr1 = {21,18,15,23,52,12,61}; //calling the sort function which performs insertion sort insertionSort(arr1); //calling the printArray function which performs printing of array printArray(arr1); } }
出力:
12 15 18 21 23 52 61
説明:
上記の挿入ソートのコードでは、最悪のケースは、配列が逆順になっている場合です。そのため、要素が左端の要素と比較されるたびに、要素は常に小さくなり、その後に必要なすべての先行要素と比較されます。配置してずらして挿入するだけです。この場合、挿入ソートの複雑さは O(n^2) です。
平均的な場合でも、挿入ソートの複雑さは O(n^2) で、一部の要素はシフトする必要がありませんが、一部の要素は位置からシフトされ、正しい位置への挿入が実行されます。
挿入ソートは、配列のサイズがそれほど大きくない場合、または少数の要素のみをソートする必要があり、ほぼすべての要素がソートされており、一部の変更のみを行う必要がある場合に使用するのが最適です。挿入ソートは、小さいサイズの配列に対して最も高速なアルゴリズムの 1 つであり、クイック ソートよりもさらに高速です。実際、クイックソートは配列の小さな部分をソートするときに挿入ソートを使用します。
上記の説明は、Java での挿入ソートの動作と実装を明確に示しています。他のプログラミング言語でも、挿入ソートを実行するロジックは同じであり、構文が変わるだけです。すべての並べ替えアルゴリズムがすべてのシナリオに適合するわけではないため、並べ替えアルゴリズムを実装する前に、並べ替えを実行する必要があるシナリオの分析を行うことが非常に重要です。
以上がJavaでの挿入ソートの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。