Haskell快排代碼

haskell這段遞歸快排很短,而且還可以處理不同類型的數據,很優雅。

qSort ::(Ord a)=>[a]->[a]
qSort []=[]
qSort (x:xs)=
    let smallerNum=filter (<=x) xs
        largerNum=filter (>x) xs --[a|a<-xs,a>x]這裏也可用列表推導式來寫
    in  qSort smallerNum++[x]++qSort largerNum

haskell中有一個“類型類”的概念,類比java來說,和類的概念倒相差甚遠,反而和接口的概念比較相似。上面的快排代碼自帶泛型屬性,可以對數字排序也可以對字符排序(凡是屬於Ord的實例的類型都可以被排序),如果在類型限定中寫上Num a那麼就只能對數字進行排序了。

更新一下:上面這段代碼filter了兩次,那麼也可以寫的更簡潔,只filter一次

qSrot ::(Ord a)=>[a]->[a]
qSort []=[]
qSort (x:xs)=qSrot l ++ [x] ++qSort r
    where (l,r)=partition (<x) xs

這樣代碼就更短了,很精巧,代碼完全在描述自己在做什麼而不是怎麼做。可以看出haskell真的是高度抽象啊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章