我正在尝试使用数组实现bubblesort,但我很难这样做。这是我到目前为止所做的:
fun swap(A, i, v) =
let
val temp = sub(A, i);
in
update(A, i, sub(A, v));
update(A, v, temp)
end;
到目前为止,这需要一直很长时间。
异常空;
fun bubbleSort(nil, i) = raise Empty
(* if has one element, already sorted)
| bubbleSort(
(* if at least two elements, compare *)
| bubbleSort(A, i) =
if i < A.length then
if sub(A, i) > sub(A, i+1) then
swap(A, i, i+1)
else bubbleSort(i+1);
1)现在,这只会通过一次&gt; = 2个元素。但是,bubblesort算法会继续,直到你不再需要交换元素,我不知道如何递归地实现它。
2)我们如何在长度为1的数组上进行模式匹配?有了列表,它只是bubbleSort([x])
...
任何帮助实施都会很棒, bclayman
答案 0 :(得分:2)
要回答您的第一个问题,一种方法是在bubbleSort
函数中添加一个额外参数,以确定您是否已达到固定点。您的函数将具有以下类型
bubbleSort : int Array -> int -> bool -> int Array
在每次迭代中,如果您实际执行交换,则将该标志设置为true。完成整个数组后,检查是否已设置标志,如果是,则将i
重置为0.继续重复此过程,直到完成整个操作而不设置标志。
数组上的模式匹配不是通常完成的事情,你可以为矢量做(请参阅this链接,请注意这是特定于SML / NJ的),但是,你可能更好地使用而是长度函数。通过这种方式,甚至不需要拆分前两种情况。您可以简单地检查长度是否小于1,如果是,则返回数组而不进行任何交换。