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真的是高度抽象啊