haskellに流し目
なんだかんだいいながらも関数型言語に興味があるので,ふつうの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]
ソート対象にもよるんだろうけど,
def quickSort( data ) return [] if data.empty? x,xs = data[0], data[1..-1] lt_x = xs.find_all {|y| y<x } ge_x = xs.find_all {|y| y>=x } quickSort(lt_x) + [x] + quickSort(ge_x) end
より,
def quickSort2( data ) return [] if data.empty? x = data[data.size/2] lt_x = data.find_all {|y| y<x } eq_x = data.find_all {|y| y==x } gt_x = data.find_all {|y| y>x } quickSort2(lt_x) + eq_x + quickSort2(gt_x) end data = (1..10).map{ rand(1000) } quick = quickSort2( data )
のほうが自然なような.
qsort [] = [] qsort s = qsort [y|y<-s,y<x] ++ [y|y<-s,y==x] ++ qsort [y|y<-s,y>x] where x = ????
こんな感じの何かになればいいのか?