ちょうど私の足がハスケルとソートアルゴリズムで濡れた。マージソートよりも速く挿入ソートパズル私より
insert_sort $ take 100000 $ randomRs (1,100000) $ mkStdGen 1 ::[Int]
merge_sort $ take 100000 $ randomRs (1,100000) $ mkStdGen 1 ::[Int]
それらの両方は、短い遅延の後に結果をプリントアウトして起動しますが、マージソートを印刷する多くの:私はここで私は彼らの効率を比較してみましょう挿入ソートを実装し、マージソート
insert_sort :: (Ord a, Show a) => [a] -> [a]
insert_sort keys = foldr f [] keys
where f key [] = [key]
f key acc = insert key acc
insert y [] = [y]
insert y (x:xs)
| x < y = x : insert y xs
| otherwise = y : x : xs
merge_sort :: (Ord a, Show a) => [a] -> [a]
merge_sort (x:[]) = [x]
merge_sort keys = merge (merge_sort (take len keys)) (merge_sort (drop len keys))
where len = length keys `div` 2
merge :: [a] -> [a] -> [a]
merge (x:xs) [] = (x:xs)
merge [] (y:ys) = (y:ys)
merge (x:xs) (y:ys) = if x <= y
then x : merge (xs) (y:ys)
else y : merge (x:xs) ys
をしましたもっと早く。わかっているように、merge-sortは大きなデータセットの挿入ソートよりもはるかに高速です。私は、結果がどのように結果を出力するかではなく、短い結果と短い結果のような結果をどのように与えるかによって表示されると考えました。私はfoldr
を挿入ソートに使っているのですか?シーンの背後には何がありますか?
EDIT:Thx人。私はハスケルを学び始めてから怠惰な評価を聞いたことがあるが、それでもハスケルを抱えている。誰かが小さなデータセットでもう少し詳しく説明しますか?[5,2,6,3,1,4]?最終的に最初の要素が来るので、結果をfoldr
で仕分けする前にどのように出力することができますか?
怠惰の世界へようこそ! –
結果を印刷する場合は、最初に計算する必要があります。したがって、結果を速く計算するアルゴリズムは、それらをより速く印刷します。それはどういう驚きですか?あるいは、私はあなたが求めているものを得られないかもしれません。 – sth
イラストが追加されました。 –