这个Haskell快速排序有什么问题

时间:2015-08-16 21:08:25

标签: haskell

尝试功能性编程并尝试从在线资料中自学Haskell。可能非常基本,但我无法理解为什么我的快速排序实现不会终止任何长度超过1的输入列表。

以下是代码:

quicksort :: (Ord ord) => [ord] -> [ord
quicksort [] = []
quicksort [element] = [element]
quicksort array = quicksort right_half ++ [pivot] ++ quicksort left_half
  where pivot = head array
        right_half = [element | element <- array, element <= pivot]
        left_half = [element | element <- array, element > pivot]

我正在阅读一本在线教科书,但在阅读给定的解决方案之前,我决定自己尝试一下快速排序。失败后,我回去了解给定的答案,但仍然不明白为什么我的错。任何帮助这个haskell新手将不胜感激!

1 个答案:

答案 0 :(得分:4)

请注意,这种算法会产生快速排序。如果没有别的话,(++)的时间复杂性会摧毁你。

至于你的问题,你正在使用<= pivot的所有元素..这将(绝对)包含数据透视。因此,如果您有一个列表[2,1],那么要对您的右半部分调用quicksort [2,1]进行排序,从而创建一个循环。

更好的解决方案是模式匹配,使用类似:

quicksort (pivot:array) = quicksort rightHalf ++ [pivot] ++ quicksort leftHalf

修改:查看相关的Why is the minimalist, example Haskell quicksort not a "true" quicksort?