【发布时间】:2017-06-25 08:36:08
【问题描述】:
由于根据问题(和讨论)“Why is the minimalist, example Haskell quicksort not a "true" quicksort?”,RosettaCode's Standard ML solution 是 Quicksort 的一个非常慢的版本,如果按照 Hoare's algoritm 的复杂性表现,功能性 Quicksort 在标准 ML 中会是什么样子?
fun quicksort [] = []
| quicksort (x::xs) =
let
val (left, right) = List.partition (fn y => y<x) xs
in
quicksort left @ [x] @ quicksort right
end
也就是说,它在有意义的地方使用了函数式编程的某些方面。与 需要 封装其就地分区的 Haskell 版本不同,除了语法之外,SML 中的快速排序是否需要与 C 版本有任何不同?函数是否接受数组/向量或花费 O(n) 时间转换列表的相关性较低。
编辑:改写了关于 John Coleman 的 cmets 的问题。
【问题讨论】:
-
由于 SML 的不纯部分涉及
ref、可变数组、循环等,因此编写命令式就地快速排序当然有些容易。有趣的问题是,您是否可以在 SML 中编写一个既高效又(大部分)功能的快速排序。