037-アルゴリズム-挿入ソート【新人エンジニアが最初に覚えたい100のJava文法】

Print Friendly, PDF & Email

ユーチューブ動画

挿入ソートについて解説します。

ソースコード

public class ArgoSortInsert {
	public static void main(String[] args) {
		int[] data = { 30, 60, 70, 90, 20 };
		sort(data);
		for(int element : data){
			System.out.print(element + " ");
		}
	}
	public static void sort(int[] data) {
		for(int i = 1; i < data.length; i++){
			int tmp = data[i];
			int j = i;
			while(j > 0 && tmp < data[j - 1]){
				data[j] = data[j - 1];
				j--;
			}
			data[j] = tmp;
		}
	}
}


解説

挿入ソートについて解説します。

プログラムを組み立てるときには、プログラムの解法が必要です。

プログラムの解法をアルゴリズムといいます。

代表的なアルゴリズムを覚えておくと、将来いろいろなプログラムを組むときのヒントになります。

ここでは、挿入ソートを紹介します。

ソートは並び替えです。

サンプルコードでは、配列dataを並び替えるため、sortメソッドを呼び出し、for文で並び替えた後の要素を出力しています。

なお、for文では拡張for文が利用されているので、配列dataの要素を1つ取り出し、変数elementに入れることで繰り返し出力しています。

挿入法は、ソートしていない部分とソートしている部分に分けるところから始まります。

ソートしていない部分から要素を一つ取り出し、ソートしている部分の中で適切な場所に挿入するアルゴリズムです。

1回目の繰り返しでは、最初のfor文で要素の1番目を取り出し、変数tmpに代入します。

変数tmpは60になります。

変数iから変数jに代入し、次のwhile文で、挿入する部分を探します。

1回目の繰り返しでは、tmp<data[1-1]になるので、0番目の要素と比較します。

しかしTmpのほうが大きいので、whileの処理には入りません。

また変数jの値は変わりません。よって、変数tmpの値をdata[1]に戻して、終わります。

続けていくと、70を取り出したとき、90を取り出したときには、変化しません。

最後の繰り返しで、4番目を取り出し、変数tmpに代入します。変数tmpは20になります。

変数jには4が入ります。While文は、tmp<data[4-1]、つまり20<90となり、継続条件を満たします。

すると、data[4]=data[4-1]となり、20が入っていたところに、90が入ります。Jの値が1減ります。

次のtmp<data[3-1]でも、20<70となり、継続条件を満たします。

すると、data[3]=data[3-1]となり、90が入っていたところに、70が入ります。

このように配列の要素をずらしていくと、jが1になったとき、data[1]=data[1-1]となり、

60が入っていたところに30が入り、jが0になって、whileを抜けます。

最後にdata[0]に変数tmpの20が挿入されて、ソートが終了します。

いかがでしょうか?

頭の中だけで考えずにぜひ書き出して考えてみてください。

以上、挿入ソートについて解説しました。

このサンプルコードをJavaタッチタイプゲームとして遊ぶことができます。