没有使用大小写表达式(在类的下一节出现),我看不出为什么以下不做快速排序。它在某个地方进入循环,永远不会结束。ML中的快速排序
splitAt和append已经过测试,但这里是他们的代码。
fun append(xs, ys) =
if null xs
then ys
else (hd xs) :: append(tl xs, ys)
fun splitAt(xs : int list, x : int) =
let
fun sp(ys : int list, more : int list, less : int list) =
if null ys
then (more, less)
else
if hd ys < x
then sp(tl ys, more, append(less, [hd ys]))
else sp(tl ys, append(more, [hd ys]), less)
in
sp(xs, [], [])
end
fun qsort(xs : int list) =
if length xs <= 1
then xs
else
let
val s = splitAt(xs, hd xs)
in
qsort(append(#2 s, #1 s))
end
我也得到使用追加(快速排序(#2秒),快速排序(#1秒))同样的问题,但我虽然前者是更好的风格,因为它仅需要每一轮单一的递归。 我想我应该说'splitAt'将列表分成大于或等于第二个参数,小于,并创建一个元组)。附加连接2个列表。 PS:这只是一个实践问题,而不是测试或家庭作业。
您需要提供'splitAt'和'append'的代码。如果代码错误,错误可能在那里。话虽如此 - 不会像'append(qsort(#2 s),qsort(#1 s))'更有意义吗? –