低速アルゴリズム
単純挿入ソート ( Insertionsort )
単純挿入ソートは、対象とするデータがリストのようなときにはとても有効である。しかし、単なる配列データの時には、基本的な考え方はバブルソートと同じである。また、例をあげて解説しよう。
49 66 11 37 84 6 22 73
単純挿入法では、あらかじめ並べ換えが済んでいるデータ列に新たにデータを挿入する事を基本としている。そこで、まず左から1番目までが並べ換えが済んでいるとして、2番目のデータをそこに挿入することを考える。この例では、49が1つしかないデータ列に66を挿入することを考える。この場合は、なんの変化もない。
49 66 11 37 84 6 22 73
次に、49,66のデータ列に11を挿入することを考える。大きい方から小さい方(右から左へ)に向かって比較していき、ソート済みのデータ列のどこに挿入できるかを見ていく。この場合は、11が一番小さいため一番左に挿入されたことになる。
11 49 66 37 84 6 22 73
次に、11,49,66のデータ列に37を挿入する。66から左へ順に見ていく。
11 37 49 66 84 6 22 73
以下、同様な操作を行なう。
11 37 49 66 84 6 22 73
6 11 37 49 66 84 22 73
6 11 22 37 49 66 84 73
6 11 22 37 49 66 73 84
以下のような、プログラムが作成できる。
1: void Insertionsort(int data[], int n) {
2: int tmp, i, j;
3:
4: for( j=1; j < n; j++ ) {
5: i = j - 1;
6: tmp = data[j];
7: while( (i>=0) && (tmp < data[i]) ) {
8: data[i+1] = data[i];
9: i = i - 1;
10: }
11: data[i+1] = tmp;
12: }
13: }
単純挿入ソートもO(n^2)の計算量を持つことは、4のforループ内に7のwhileループが存在することから予想できる。単純選択ソートと同様な方法で容易に示せる。
以上、3種類の低速アルゴリズムを示した。これらのアルゴリズムは単純であるが、O(n^2)の計算量を持つことが理解できたであろう。
このn^2のオーダーがどの程度のものなのかは、y=x^2のグラフを方眼紙に書いてみるとよい。xがある数値を越えると、yが急に大きくなり方眼紙をはみ出してしまう。このように、データの個数がある点を越えると、ソートにとてつもなく時間を要するようになるということである。
戻る
アプレットに戻る
a93sj030@j.dendai.ac.jp