マージソート(Haskell)のコードを書いていました。
2つのリストを順番に並べる機能について質問です。
(すなわち [1,4,7] [2,5,6] -> [1,2,4,5,6,7])
これは私のオリジナルのコードです。(xs、ys はパラメータで、zs はアキュムレータです。)
msort4 [] ys zs = zs ++ ys
msort4 xs [] zs = zs ++ xs
msort4 allx@(x:xs) ally@(y:ys) zs
| x <= y = msort4 xs ally (zs ++ [x])
| otherwise = msort4 allx ys (zs ++ [y])
これは、オンラインで見つけたコードを参照して書いた 2 番目のコードです。
msort4 [] ys = ys
msort4 xs [] = xs
msort4 allx@(x:xs) ally@(y:ys)
| x <= y = x :msort4 xs ally
| otherwise = y : msort4 allx ys
この小さな違いだけで、私のコードは大幅に改善されました。
私は約 500 語のリストをソートしていましたが、元のコードでは約 2.5 秒かかりましたが、新しいコードでは平均で 0.4 秒以内にソートされます。
よく似ているのに、オンラインの方がはるかに高速であるのに、なぜ私のほうが遅いのか疑問に思っています。(私のものは行き来する必要がないので、私のものの方が速いとさえ思っていました。)
前もって感謝します。