ウィリアムのいたずらの、まちあるき、たべあるきーPART2

gooブログ「ウィリアムのいたずらの、まちあるき、たべあるき」がお引越ししてきました

クイックソートあれこれ

クイックソートというと、

http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/images/quick-sort-image.gifより引用

のような図を見ると思う。
この図を素直に、コーディングしろといわれたら、こうやってコーディングするんじゃないだろうか

//クイックソート(図から考えたバージョン)

リスト クイックソート(リスト 対象リスト)
{

    もし、対象リストの要素が1個以下なら
       return 対象リスト;


    対象リストから基準値を1個取る
    リスト生成(new)
       小さいものリスト
       大きいものリスト

    対象リストの要素を全てチェックするまで、以下の処理繰り返し
        もし、対象リストの要素が、基準値より小さければ
           小さいものリストに入れる
        もし、対象リストの要素が基準値以上だったら、
           大きいものリストに入れる

    対象リストフリー

    return リスト結合(クイックソート(小さいものリスト),リスト(基準値),クイックソート(大きいものリスト)
}

でも、実は、クイックソートというのは、こうやっていないらしい
リストをわざわざ作っていない。

実際、Wikipediaには、違うアルゴリズムが書いてある。

それについて、メモメモ。




■実際にやっていること

どうやら、こういうロジックのようだ。

以下、小さい順に並べる場合。

(1)対象の数列があるとする
   1 9 5 3 2 7 6



(7)ここ(赤線のところ)でわけると、左側は基準値よりも少ない数
   右側は、基準値以上の数に分かれる・・・
   なので、
      左側の数字列{1,2,5,3}でクイックソート、
      基準値{6}、
      基準値を除く右側の数字{9,7}でクイックソート
   
   して、連結すればいいことになる

・・・らしい。ほお・・・