平成19年度
http://www.is.nagoya-u.ac.jp/exam-old/d20608.pdf
[1]クイックソート
(1)実行時間のオーダー/最悪な場合
最悪な場合は、すでに対象となる配列が整列されている場合、だというのは有名。
この場合、一回につき対象となる配列が1回短くなるだけ。なので、必要な比較回数は
よって、
また、これが起こるのはp(ピボッド)が、最小または最大の要素だった場合。
(1)実行時間のオーダー/最善の場合(best case)
最善の場合は、配列の長さが1/2づつになっていく。
なので、必要な比較回数は、
という漸化式で表せる。nは分割するときに各要素を調べるので必要。
これを解くと、
となる。
よって、
またこれが起こるのは、pがちょうど配列を二等分するとき。
(2)メモリ使用量のオーダー
qsortを呼ぶときに使用されるスタックが消費される。なので、qsortが呼ばれる回数が問題になる。
そして、qsortは配列の左部分をソートするために呼ばれるので、左部分の長さが問題になる。
(2)メモリ使用量のオーダー/最悪の場合
左部分の長さが、1づつしか減らない場合が最悪となる。
なので、
となる。
よって、
また、これが起るのは、pが最小の要素である場合である。
(2)メモリ使用量のオーダー/最善の場合
左部分の長さが、常に1の場合が最善となる。
よって、
また、これが起るのは、pが最大の要素である場合である。
(3)プログラムの改良
常に、短い方だけを再帰的にソートすればいい。
if(i-left < right-j){ // 条件があやしい // 左のほうが短い qsort(a,left,i-1); left = j+1; }else{ // 右のほうが短い qsort(a,j+1,right); right = i; }