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

posted @ 2012-12-04 14:28  唐僧吃肉  阅读(369)  评论(0编辑  收藏  举报