低速アルゴリズム

 

単純挿入ソート ( 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