尝试功能性编程并尝试从在线资料中自学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新手将不胜感激!
答案 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?