1 練習問題

以下、繰り返しのDO文と1次元配列の練習問題を示します。プログラムを作成 して、実行結果を確認すること。ただし、いろいろなレベルの問題が用意され ています。各人のレベルに合わせて、問題のプログラムを作成すること。

1.1 教科書の問題

教科書の例題をプログラムして、内容を理解すること。ただし、教科書の解答 のプログラムは、結果をラインプリンターに出力する場合です。皆さんは、ディ スプレイに結果を出力するため、FORMAT文を書き換える必要があります。それ は、FORMAT文の括弧の最初の部分でこれはラインプリンターの制御を表します。 2。具体的には以下の部分を書き換 えます。 このラインプリンター制御文字に注意しながら、以下の問題を解きなさい。
  1. 教科書の例題3・1のプログラムを作成しなさい。
  2. 教科書の例題3・2のプログラムを作成しなさい。

1.2 ちょっとだけ応用

  1. DO文を利用して、1〜Nまで足し合わせるプログラムを作成しなさい。
  2. 一次元配列に、 $ 1,3,5,7,\cdot,N$を格納し、それを足し合わせるプロ グラムを作成しなさい。

1.3 ソーティング

ソーティングとは、整列あるいは並び替えのことである3。プログラミングでは、 数値を大きい順、あるいは小さい順に並び替える技法のことを言います。数値 の並び替えは非常に重要な技法で、実際のプログラムではいたるところで使わ れます。ソーティングでもっと重要なことは、処理速度です。高速な処理を目 指していろいろなアルゴリズムが考えられています。簡単なアルゴリズムを示 しますので、数値の入ったデータを小さい順(昇順)に並び替えなさい。

なお、その前に並び替えるデータの作成方法を示しておきます。以下のプログ ラムにより、0〜1の乱数4が、配列名DATAに1024個入れられ る。RAND()が0〜1の実数を発生させる。SRANDにより、初 期値が決まる。この値を変えると発生される乱数が異なる。どんな値を入れて も良い。 make_rand_data.tex

1.3.1 単純挿入法

有名な教科書「NUMERICAL RECIPES in C」によると、これは経験をつんだトラ ンプ師が使う方法と同じということです。順序がばらばらのトランプを並び替 える場合、
  1. まず、2枚目のカードを拾い、1枚目と順序関係が正しい位置におく。
  2. 次に3枚目のカードを拾い、最初の2枚と順序関係の正しい位置にそれを 挿入する。
  3. 同じことを繰り返す。即ち、$ i$枚目のカードを拾い、最初の$ i-1$枚の カードの順序関係の正しい位置にそれを挿入する。
  4. 最後のカードを正しい位置に挿入したら、並び替えは完了である。
という操作を行います。

これと同じことを先に示した1024個のデータについて行い、小さい順に並び替 えなさい。ただし、ヒントとしてフローチャートを図[*]に示します。

図 1: 単純挿入法のフローチャート
\includegraphics[keepaspectratio, scale=1.0]{figure/flow_simple_sort.eps}

1.3.2 shellソート

Shellソート5は1959年 にD.L.Shellが考案した方法で、単純挿入法を改良したものとなっています。 単純挿入法は、隣同士を比較しましたが、Shellソートでは、大きな$ H$飛ばしで 比較します。ソートに時間のかかる大ききな数や小さな数は、一気に右や左 に行きます。$ H$と飛ばしで比較すると、

\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*}

と並び替えます。この並び替えには単純挿入法を使います。

そうして、とび幅$ H$をどんどん小さく、最後は$ H=1$にすると並び替えは完了 です。この$ H$の選び方にこつがあって、小さいほうから $ 1,4,13,40,121,\cdots$と3の倍数+1とするのが良いそうです。良いというの は早いと言うことです。最初に実行する一番大きな$ H$は、データの個数の半 分以下にします。

Shellソートの手順は、次の通りです。

  1. 最初の飛び幅$ H$を決める。$ H$である3倍して1を加えた値が、データ数以下にな るものを探す。データこ個数の半分以下で最大の$ H$を最初の飛び幅と する。
  2. $ I=1,2,3,\cdots,H$に対して、 $ A(I),A(H+I),A(2*H+I),A(3*H+I),\cdots$を並び替える。
  3. 次のI=I+1にして、並び替える。
  4. 次のH=(H-1)/3にして、再度、並び替えを実行する。

単純挿入法のプログラムが出来た人は、このプログラムを書いて、実行させな さい。

1.3.3 その他のソーティング

実際のソーティングでは、ヒープソートあるいはクイックソートが使われます。 これらの説明は、この講義のレベルを超えますので、興味のある人は自分で調 べてください。
ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成19年8月20日


no counter