haskell排序的操作
注意处理相同的元素
1快排
qsort []=[]
qsort (h:t)=(qsort(filter (<h) t) )++(num (h:t)) ++(qsort(filter (>h) t))
num (h:t)=filter (==h) (h:t)
2冒泡
(1)
bubble_once [] = []
bubble_once [x] = [x]
bubble_once (x : y : zs) | x < y = y : bubble_once (x : zs)
| otherwise = x : bubble_once (y : zs)
bubble_sort [] = []
bubble_sort list = x : bubble_sort xs
where (x : xs) = (reverse . bubble_once) list
(2)不reverse的例子,不过,++ 和init的操作效率不高,估计和你的差不多:
bb [] =[]
bb [x] = [x]
bb (x:y:xs) | x > y = y: bb (x:xs)
| otherwise = x: bb (y:xs)
bubsort [] = []
bubsort xs = let z = bb xs in bubsort (init z) ++ [last z]
(3)选择排序
import Data.List
select_sort ::Ord a => [a]->[a]
select_sort [] = []
select_sort l =
let
m = maximum l
num = elemIndexNum m l
list0 = numElemList num m
in
list0 ++ select_sort (filter (<m) l)
--列表中某特定元素的个数
elemIndexNum ::Ord a => a ->[a]->Int
elemIndexNum x xs= length $ elemIndices x xs
--相当于python中的[x]*num
numElemList ::Ord a => Int->a ->[a]
numElemList 0 x=[]
numElemList num x= x : numElemList (num-1) x
主要转载自:水木 :http://www.newsmth.net/nForum/#!article/FuncProgram/24436?p=1