リスト内包表記の書き方がわかったので、これを使ってクイックソートを書いてみる。クイックソートと言えば、はじめて C で書いたときはちょっとしたミスで、エラーでまくりで嫌になったもんだ。そういえば, VB でも Java の真似して、ソートのためのインターフェイスを implement してクイックソート書いた覚えもあるなぁ ^^;
クイックソートとは
クイックソート - Wikipedia によると、アルゴリズムは、
こうやってみると、なんてシンプルなんだ。。。(@_@;)
Haskell でクイックソート
About Haskell の「クイックソート」では、
qsort [] = []
qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
where
elts_lt_x = [y | y <- xs, y < x]
elts_greq_x = [y | y <- xs, y >= x]
アルゴリズムが素直に表現されていてわかりやすい。
Python で書いてみる
Haskell のコードを真似して、
def qsort(list):
if list == []: return []
else:
p = list.pop(0)
return qsort([x for x in list if x < p]) + \
[p] + \
qsort([x for x in list if x >= p])
うーむ、簡潔に書けるものだ。 ^^
では、同じように、 Ruby でも、
def qsort(list)
if list.empty? then return []
else
p = list.shift
return qsort(list.select{|x| x < p}) +
[p] +
qsort(list.select{|x| x >= p})
end
end
参考
リストの操作については、
一文を複数行へ分ける方法は、
0コメント:
コメントを投稿