2010年10月19日火曜日

クイックソートのソースを読んだ

Check
抽象化するのか具体化するのか中途半端になっちゃった。




もっとこまかくしたいな。


'Sub関数宣言(引数:array=配列、first=開始位置、last=終了位置)
 Sub quicksort(array, first, last)
     '変数宣言(point=配列の値, f=, l, tmp)
     Dim point, f, l, tmp
     '一番初めの配列の値を格納する
     point = array(first)
     '開始位置と終了位置を格納する
     f = first: l = last
     'ループ処理
     Do
         '値同士を比較して、一番初めに格納した値よりも小さければ、fを加算し続ける
         While array(f) < point: f = f + 1: Wend
         '値同士を比較して、一番初めに格納した値よりも大きければ、lを減算し続ける
         While array(l) > point: l = l - 1: Wend
         'fがlと一致するかlよりも大きい場合ループ処理を抜ける
         If f >= l Then Exit Do
         'fがlより小さい場合f番目の配列の値をtmpに格納する、
         'f番目の配列の値にl番目の配列の値を格納する、
         'l番目の配列の値にtmpを格納する
         '(要するにf番目の配列とl番目の配列を入れ替える)
         tmp = array(f): array(f) = array(l): array(l) = tmp
         'fに1加算、lから1減算
         f = f + 1: l = l - 1
     Loop
     '引数の開始位置よりもf-1が大きい場合再帰する(引数に配列、開始位置、f-1を設定)
     If first < f - 1 Then quicksort array, first, f - 1
     'l+1よりも引数の終了位置が大きい場合再帰する(引数に配列、l+1、終了位置を設定)
     If l + 1 < last  Then quicksort array, l + 1, last
'関数終了
 End Sub