问题描述
我正在尝试在不使用任何 List.nth 函数的情况下编写快速排序算法。我想出了这个,但是当我尝试对其进行测试时,它最终会抛出一个“未捕获的异常 Empty”。我似乎无法找到抛出此异常的位置。 这是我的代码:
(*returns last element in list*)
fun last (h::nil) = h
| last(h::lst) = last(lst)
| last _ = ~1;
(*returns middle element in list*)
fun middle (lst) =
let
fun middle_rec (_ :: []) (x :: _) = x
| middle_rec (_ :: _ :: []) (x :: _) = x
| middle_rec (_ :: _ :: xs) (_ :: ys) = middle_rec xs ys
| middle_rec _ _ = ~1
in
middle_rec lst lst
end;
(*return median of three elements*)
fun median(a,b,c) =
if ((b>a andalso a>c) orelse (c>a andalso a>b))
then a
else if ((a>b andalso b>c) orelse (c>b andalso b>a))
then b
else if ((a>c andalso c>b) orelse (b>c andalso c>a))
then c
else ~1;
(*partitions a list with one containing elements smaller than or equal to p and one with elements greater than P*)
fun partition([],p) = ([],[])
| partition(lst,p) =
let
fun part_rec ([],x::xs,y::ys,p) = (x::xs,y::ys)
| part_rec (lst,x,y,p) =
if hd(lst) <= p
then part_rec(tl(lst),hd(lst)::x,p)
else part_rec(tl(lst),hd(lst)::y,p)
in
part_rec(lst,[],p)
end;
(*quicksort function*)
fun quicksort [] = []
| quicksort(x::xs) =
let val (left,right) = partition(x::xs,median(x,middle(x::xs),last(x::xs)))
in
quicksort left @ [x] @ quicksort right
end;
quicksort([9,4,7,2,8,5,1,6,3]);
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)