【问题标题】:Selection Sort in SML with a Twist扭曲的 SML 中的选择排序
【发布时间】:2012-02-24 20:04:40
【问题描述】:

我开始对 sml 更加熟悉,但是这个问题让我陷入了困境。我需要做的是在列表上执行选择排序,但扭曲的是所有偶数都需要进行奇数。

例如:

selSort[1, 6, 9, 3, 8, 4, 7, 2, 5, 3];
val it = [2, 4, 6, 8, 1, 3, 5, 7, 9] : int list

如果没有某种 for 循环或变量来帮助我,我无法做到这一点。由于我是 sml 的新手,任何输入将不胜感激。谢谢!

【问题讨论】:

    标签: functional-programming sml smlnj


    【解决方案1】:

    函数式语言中的数据结构通常是不可变的;也就是说,它们一旦创建就无法修改。因此,您不能像在基于迭代数组的实现中那样执行就地交换。相反,您需要编写一个函数,将您的原始列表作为参数,并返回它的独立副本以及您想要的更改。

    例如,看一下内置函数rev。它会返回您传递给它的任何列表的反转版本,但它不会(实际上,它可以不会)改变原始列表的结构。

    在这种情况下,您可能需要一个函数min(xs) 来查找xs 中的最小元素x,以及一个返回xs 副本的函数remove(x,xs) 删除了x(让我们调用它remainder)。然后对remainder进行递归排序,并将x添加到结果中。

    不使用< 比较min 中的元素,您可以通过定义自己的比较函数lessThan 来强制执行这种不寻常的排序,其中lessThan(x,y) 始终为真,如果x 是偶数且y很奇怪。

    fun lessThan(x,y) = (x mod 2 = 0 and y mod 2 = 1) or (x mod 2 = y mod 2 and x < y)
    

    现在只需将min(xs) 函数中的任何x &lt; y 实例替换为lessThan(x,y)

    更好的是,编写一个版本selSort(list,comp),它将比较函数comp 作为参数。然后你可以通过(op &lt;) 执行标准排序,lessThan 执行这种“扭曲排序”,甚至可以使用它对非整数列表进行排序(只要你给它一个具有相应类型的比较函数)。

    【讨论】:

    • 感谢您的回复,这肯定会有所帮助。我最大的问题是弄清楚如何让选择排序工作。在java中,我会将它编程到它将遍历一个数组、进行交换、更新我的索引和递归的地方。在 sml 中,我没有索引和交换的奢侈(据我所知)。所以,我不知道该如何设置。
    • 对不起,我以为只是“扭曲”让你失望了。我会更新我的答案。
    • 天才。这帮助了很多。谢谢。
    猜你喜欢
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 2010-10-15
    • 2011-04-06
    • 1970-01-01
    • 2015-04-03
    相关资源
    最近更新 更多