【问题标题】:Standard ML: BubbleSort with Arrays标准 ML:带数组的 BubbleSort
【发布时间】:2015-10-20 21:30:21
【问题描述】:

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

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])...

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

【问题讨论】:

    标签: arrays functional-programming sml


    【解决方案1】:

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

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

    在每次迭代中,如果您实际执行交换,则将该标志设置为 true。遍历整个数组后,检查标志是否已设置,如果已设置,请将 i 重置为 0。继续重复此过程,直到您在不设置标志的情况下完成所有操作。

    数组上的模式匹配不是通常完成的事情,您可以为向量执行此操作(请参阅this 链接,请注意这是特定于 SML/NJ 的),但是,您可能最好只使用长度函数反而。这样,甚至不需要拆分前两个案例。您可以简单地检查长度是否小于 1,如果是,则返回数组而不进行任何交换。

    【讨论】:

    • 数组和向量在 SML 中不是一回事,所以你答案的第二部分不太准确。此外,向量模式匹配并不是 SML 的标准特性。
    • @IonuțG.Stan,你是对的,我已经相应地编辑了我的答案。谢谢
    • @Matt 但如果我检查长度是否为 1,那么当它到达列表的最后一个元素并在其上调用 bubbleSort 时,我想我会遇到麻烦。 B/c 那么它将是一个长度为 1 的列表,它会返回数组。但它不一定会被排序(它只会遍历数组一次,没有检查任何标志 re: 是否发生交换)...
    • 我认为您可能混淆了数组和列表。例如,您在问题中提供的内容会出现类型错误,因为nil 的类型为int list,而A 的类型为int array。请记住,您不是在递归调用中缩短数组的长度,您只是在推进整数,它决定了下一个要处理的位置。因此,即使到达数组的末尾,Array.length A 也将始终相同。
    猜你喜欢
    • 2016-01-19
    • 1970-01-01
    • 2017-11-23
    • 2015-04-05
    • 2010-11-12
    • 2011-05-05
    • 2012-04-09
    • 1970-01-01
    • 2021-02-07
    相关资源
    最近更新 更多