2016-04-21 82 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分鐘,它仍在運行!即使是一個100,000的列表並不是那麼大,所以:

  1. 我怎麼能處理數據十億的數據?這是一個在Haskell語言中的問題
  2. 我怎麼能預測一個算法的運行時間使用其複雜性?
+7

第一個元素是一個可怕的樞軸選擇。此外,你的重複處理是完全錯誤的;樞軸的任何副本都進入「較小」和「較大」! – user2357112

+3

快速排序就地!這不是快速排序。 – dotctor

+0

如果不是唯一值,則還需要確保輸出中出現* all *個*符號。 – chepner

回答

7

快速排序的最壞情況下的時間是Ñ2。您的實現使用第一個元素作爲數據透視表,當輸入被排序(或反向排序)時,會導致最差情況下的性能。

要獲得快速排序在ň日誌ň其預期的複雜性來執行,你需要或者隨機的選擇轉動或排序之前,隨機混合輸入。

+0

排序使用排序洗牌然後排序排序洗牌排序? –