您的位置:首页 > 其它

haskell排序的操作

2012-12-04 14:28 106 查看
注意处理相同的元素

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: