我已成功地實現在幾行插入排序和快速排序,而是選擇排序和歸併仍然讓我頭疼;)簡化選擇排序和歸併
selectionsort [] = []
selectionsort (x:xs) =
let (minimum, greater) = extractMinimum x [] xs
in minimum : selectionsort greater
extractMinimum minimumSoFar greater [] = (minimumSoFar, greater)
extractMinimum minimumSoFar greater (x:xs)
| x < minimumSoFar = extractMinimum x (minimumSoFar:greater) xs
| otherwise = extractMinimum minimumSoFar (x:greater) xs
是有點像extractMinimum
功能提供標準的圖書館嗎?沒有任何運氣,我嘗試了(a -> a -> Bool/Ordering) -> [a] -> (a, [a])
的窩點。
mergesort [ ] = [ ]
mergesort [x] = [x]
mergesort xs =
let (left, right) = splitAt (length xs `div` 2) xs
in merge (mergesort left) (mergesort right)
merge xs [] = xs
merge [] ys = ys
merge [email protected](x:xs) [email protected](y:ys)
| x < y = x : merge xs yys
| otherwise = y : merge xxs ys
同樣,我必須寫merge
自己,或者我可以重用現有的組件? Hoogle給(a -> a -> Bool/Ordering) -> [a] -> [a] -> [a]
沒有任何有用的結果。
nb @sudo_o和任何批准該編輯的人:[Hoogle](http://www.haskell.org/hoogle/)是一種搜索引擎,允許您通過類型簽名搜索Haskell庫函數;它不是谷歌的錯字。 – dave4420
請原諒我的無知哈哈.. –
順便說一句,自頂向下mergesort是一個非常糟糕的想法與Haskell列表。你花了大量的時間分割列表和查找列表的長度。從下往上工作要簡單得多。首先將輸入轉換爲長度爲一的列表,然後合併相鄰的列表對,直到只剩下一個。 – Carl