次のプログラムを作りなさい (言語は C, Java, COBOL, CASL II のうちのいずれか)
配列に数が与えられている時、それを整列させる方式(アルゴリズム)はいくつかある。 次に説明する各方式により整列させるプログラムを書きなさい。 (配列の添字は 1 から n までとする)
これを i=1 から n まで繰り返すと、少なくとも最大の値が最後尾に移動する。 したがって、さらに、次に i=1 から n-1 まで行うと二番目に大きい値が n-1 番目に移動する。 よって、「i=1 から n」,「i=1 から n-1」,...,「i=1 から 2」と n-1 回繰り返すと全ての値が整列する。
これを実現するには以下のような「再帰処理」という方式が便利である。
今、分割を行うサブルーチンを partition(s,t) とする。これは、配列の s 番目から t 番目までに対して上記の処理を行うサブルーチンである。
このサブルーチンでグループ分けをした結果、 s 番めから u 番目が小さいもののグループ、u+1 番目から t 番目が大きいもののグループと分かれたとする。
この時、このサブルーチンの中で partition(s,u) と partition(u+1,t) が呼べると便利である。
但し、このようなサブルーチンの定義の中で自分自身を呼ぶようなことは C と Java しか利用できない。
他のプログラミング言語では、大量に発生する分割の位置をどのように覚えるかがプログラミングの重要な点である。
ヒープとは根付二分木で常に自分より上の(根に向かう)頂点に入っている数が大きい木である。
ヒープは通常配列上でa[i]の子がa[2i]とa[2i+1]であるように実現される。
(a[1]が根である)。
今、与えられた配列からヒープを a[1] から a[n] まで作成したとする。 与えられた配列によりヒープを作成すると、最大値が根より得られる。 つまりa[1]が最大である。 この時、a[1] と a[n] を交換し、a[1] から a[n-1] までがヒープになるように再構築する。さらに a[1] と a[n-1] を交換して再構築、と繰り返していくと整列できる。
再構築は次のように行う。
関係の壊れている a[i],a[2i],a[2i+1]のうち、最大値とa[i]を交換する。
交換された側だけ関係が壊れている可能性があるのでこれを繰り返す。
配列 a[1] から a[n] には数値が与えられているとする。
V = (Σ(a[i]-m)2)/n = (Σ(a[i]2)/n -m2
b[i] = 10 * (a[i] - m)/√V + 50
関係データベースに、次の表が定義されているとする。
次の操作を行う SQL 文を作りなさい。