2016-04-21 6 views
4

私は(マージアルゴリズムを並べ替える使用して)以下のクイックソートHaskellの機能を実行します。haskellクイックソートの複雑さ?

qsort []=[] 
qsort (x:xs) = 
    qsort smaller ++ [x] ++ qsort larger 
    where 
     smaller = [a | a <- xs , a<x ] -- edit 
     larger = [b | b <- xs , b>=x ] 

データのビット大きな量のために、このためのランタイムをテストするために、私は以下のコードを実行します

qsort [100000,99999..0] 

今のところ40分かかり、まだ走っています!たとえ10万のリストでさえそれほど大きいわけではありません:

  1. 10億のデータをどのように扱うことができますか?
  2. このソートアルゴリズム(マージとソート)は、C#、Pythonなどの他の言語では時間がかかりません...これはhaskell言語の問題です
  3. どのようにアルゴリズムの実行時間を予測することができますか?
+7

最初の要素はピボットのひどい選択です。また、重複した処理は間違っています。ピボットの重複は、「より小さい」と「大きい」の両方に入ります! – user2357112

+3

クイックソートはインプレースです!これはクイックソートではありません。 – dotctor

+0

また、一意の値でない場合、 'x'の* all *が出現するようにする必要があります。 – chepner

答えて

7

クイックソートの最悪の場合の時間は、Nあります。インプリメンテーションでは、最初の要素をピボットとして使用します。これは、入力がソートされるとき(または逆順にソートされるとき)に最悪の場合のパフォーマンスをもたらします。

NログNのその期待複雑で実行するためにクイックソートを取得するには、いずれかの無作為化、ピボット選択を必要とする、またはランダムに並べ替えの前に入力をシャッフルします。

+0

ソートシャッフルをソートするには、ソートシャッフルソートをソートしますか? –

関連する問題