SML - 找不到在快速排序算法中抛出“未捕获的异常 Empty”的位置

问题描述

我正在尝试在不使用任何 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 (将#修改为@)