标准 ML:使用数组的冒泡排序

Standard ML: BubbleSort with Arrays

我正在尝试使用数组实现冒泡排序,但我很难做到。这是我目前所拥有的:

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) 现在,这只会遍历 >= 2 个元素的数组一次。但是冒泡排序算法一直持续到您不再需要交换元素为止,我不确定如何递归地实现它。

2) 我们如何在长度为 1 的数组上进行模式匹配?对于列表,它只是 bubbleSort([x])...

任何帮助实施都会很棒, 克莱曼

要回答您的第一个问题,一种方法是向您的 bubbleSort 函数添加一个额外的参数来确定您是否已达到固定点。您的函数将具有以下类型

bubbleSort : int Array -> int -> bool -> int Array

在每次迭代中,如果您实际执行交换,则将标志设置为真。一旦你遍历了整个数组,然后检查标志是否已设置,如果是,则将 i 重置为 0。不断重复此过程,直到你完全通过而不设置标志。

阵列上的模式匹配不是通常要做的事情,您可以为向量做(参见 this link,请注意这是 SML/NJ 特定的),但是,您最好只使用长度函数。这样,甚至不需要拆分前两个案例。您可以简单地检查长度是否小于 1,如果是,return 数组而不进行任何交换。