名古屋工業大学 工学研究科 情報工学専攻 2015年度 計算機ソフトウェア(データ構造とアルゴリズム)
Author
GPT-5.6 Sol, 祭音Myyura
Description
設問 II について答えよ。 個の相異なる自然数値が配列 A として与えられる()。配列の値を昇順にソートするアルゴリズムの擬似コードを次に示す。
1: int A[0..N-1];
2: sort(A, low, high) {
3: if (low < high) {
4: x = A[low];
5: i = low; j = high;
6: while (i <= j) {
7: while (A[i] < x) i++;
8: while (A[j] > x) j--;
9: if (i <= j) {
10: swap(A, i, j);
11: i++; j--;
12: }
13: }
14: /* 時点 P */
15: sort(A, low, j);
16: sort(A, i, high);
17: }
18: }
sort(A,0,N-1) を実行すると、配列 A 中の値が昇順にソートされる。swap(A,a,b) は、配列 A の A[a] と A[b] を入れ替える手続きである。
(1)
この擬似コードで実現されているソーティングアルゴリズムの名前を答えよ。
(2)
とし、sort(A,0,N-1) を実行する。配列 A の初期値が
A[0] | A[1] | A[2] | A[3] | A[4] | A[5] | A[6] | A[7] | A[8] | A[9] |
|---|---|---|---|---|---|---|---|---|---|
| 18 | 21 | 9 | 13 | 4 | 53 | 19 | 38 | 24 | 6 |
であるとする。擬似コードの実行が初めて時点 P(14 行目)に到達したときの配列 A の内容を書け。
(3)
4 行目を次の命令に書き換える。
4: x = median(A, low, high);
median(A,a,b) は、()である引数 に対して、
の中から 番目に小さい値を返す。ここで、天井記号 は実数 以上の最小の整数を表す。median(A,a,b) の実行時間は であるとする。
この書き換えを行った擬似コードによるアルゴリズムの最悪時実行時間を、 記法を用いて書け。
(4)
(3) の書き換えを行わない場合を考える。入力配列 A の要素数を として、アルゴリズムの最悪時実行時間を 記法で書け。また、実行時間が漸近的に最悪となる入力配列 A がどのようなものか、理由とともに説明せよ。
Kai
(1)
基準値を用いて配列を二分し、各部分を再帰的に整列しているので、
である。
(2)
最初の呼出しでは である。
- と を交換する。
- 左側では で止まり、右側では より大きい値を飛ばして で止まるので、 と を交換する。
- その後、 となって反復が終了する。
したがって、最初の時点 P における配列は
である。
(3)
基準値は中央順位の値である。分割後の部分配列の大きさを とすると、要素が相異なることから
である。median は であり、分割処理そのものは である。したがって再帰の深さは 、各再帰レベルの処理量は なので、
である。
(4)
先頭要素 A[low] が基準値である。各部分配列でこの値が最小値または最大値になると、分割後の大きさが と になり、
となる。したがって、
である。この状況を生じる入力の例は、相異なる値が昇順または降順に並んだ配列である。特に昇順の場合、各再帰呼出しでも先頭要素が最小値となり、部分配列が一要素ずつしか縮まない。
検算
与えられた擬似コードの最初の分割をプログラムで実行し、時点 P で A=[6,4,9,13,21,53,19,38,24,18]、i=4、j=3 となることを確認した。また、8 要素までの全順列が正しく整列されること、および昇順入力では分割処理量が となることを確認した。