私は C++ のバックグラウンドを持っているので、これを適切に行っているかどうかさえわかりません。しかし、私がやろうとしているのは、クイックソートを作成することですが、リストの長さが特定のしきい値未満の場合は挿入ソートにフォールバックします。これまでのところ、私はこのコードを持っています:
insertionSort :: (Ord a) => [a] -> [a]
insertionSort [] = []
insertionSort (x:xs) = insert x (insertionSort xs)
quickSort :: (Ord a) => [a] -> [a]
quickSort x = qsHelper x (length x)
qsHelper :: (Ord a) => [a] -> Int -> [a]
qsHelper [] _ = []
qsHelper (x:xs) n
| n <= 10 = insertionSort xs
| otherwise = qsHelper before (length before) ++ [x] ++ qsHelper after (length after)
where
before = [a | a <- xs, a < x]
after = [a | a <- xs, a >= x]
今私が心配しているのは、毎回各リストの長さを計算することです。Haskell が物事を最適化する方法や、上記のようなコードに対する遅延評価の完全な影響を完全には理解していません。しかし、リスト内包の前と後のそれぞれについてリストの長さを計算するのは良いことではないようです。リスト内包表記の実行中に、リスト内包表記で発生した一致の数を抽出する方法はありますか?
つまり、[x | x <- [1,2,3,4,5], x > 3]
(結果が [4,5]) だった場合、length の呼び出しを使用せずに [4,5] のカウントを取得できますか?
ヘルプ/説明をありがとう!