 枚目のカードを拾い,最初の
枚目のカードを拾い,最初の 枚のカードの
       順序関係の正しい位置にそれを挿入する.
枚のカードの
       順序関係の正しい位置にそれを挿入する.
   1 #include <stdio.h>
   2 #include <stdlib.h>    /* 乱数発生のため      */
   3 #include <time.h>      /* 時刻の関数を使うため */
   4 
   5 int main(void){
   6   int a[1024], i, j, ndata, test;
   7 
   8   ndata=1024;
   9 
  10   srand((unsigned int)time(NULL));    /* 起動毎に異なる乱数を発生させるため */
  11 
  12   for(i=0; i<ndata; i++){
  13     a[i]=rand();                      /* 配列a[i]に乱数の整数を設定 */
  14   }
  15 
  16 
  17 
  18   /*  これ以降に単純ソートと昇順に並んだ出力のプログラムを書く */
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27   return 0;
  28 }
 飛ばしで比較する.ソートに時間のかかる大ききな数や小さな数は,一気に右や左に移動
する.
飛ばしで比較する.ソートに時間のかかる大ききな数や小さな数は,一気に右や左に移動
する. 飛ばしで比較すると,
飛ばしで比較すると,
| ![\begin{equation*}\begin{aligned}&a[1] \leqq a[h+1] \leqq a[2*h+1] \leqq a[3*h+1]...
... a[3*h+h] \leqq a[4*h+h] \leqq a[5*h+h]\cdots \\ %
\end{aligned}\end{equation*}](img33.png) | 
そうして,とび幅 をどんどん小さくし,最後は
をどんどん小さくし,最後は にすると並び替えが完了となる.この
にすると並び替えが完了となる.この
 の選び方にこつがあって,小さいほうから
の選び方にこつがあって,小さいほうから
 と
と
|  |  | 
 は,データの個数の半分以下にする.
は,データの個数の半分以下にする.
Shellソートの手順は,次の通りである.
 を決める.データの個数の半分以下で最大の
を決める.データの個数の半分以下で最大の を最初の飛び幅と
      する.
を最初の飛び幅と
      する.
 に対して,
      a[i],a[h+i],a[2*h+i],a[3*h+i],
に対して,
      a[i],a[h+i],a[2*h+i],a[3*h+i], を並び替える.
を並び替える.
リスト1の19行目以降にshellソートのプログラムを書き,配列を
小さい順(昇順)に並び替えよ.