Haskell ではクイックソートが簡単に実装出来ることで有名ですが、その アルゴリズムは実は C や Java での実装と違っていたりします。ここでは、 C や Java と同じアルゴリズムを用いた副作用版のクイックソートを実装して みましょう。もち、純粋関数型版より高速になります。
         partition は副作用で as を変更するだけで
        なく、戻り値として系列の分割位置を返します。ただし、戻り値は ST モナドに
        包まれていますので、受け取るには(<-)演算子を使います。
        unsafeSwap as i j は可変配列 as の i
        番目の要素と j 番目の要素を入れ替えます。