我开始变得更加熟悉sml,但是这个问题引发了我一个循环。我需要做的是在列表上进行选择排序,但其中的一个重要原因是所有偶数都需要执行奇数。选择排序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新手,任何输入将不胜感激。谢谢!
我开始变得更加熟悉sml,但是这个问题引发了我一个循环。我需要做的是在列表上进行选择排序,但其中的一个重要原因是所有偶数都需要执行奇数。选择排序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新手,任何输入将不胜感激。谢谢!
功能语言的数据结构一般是不可变的;也就是说,创建后不能修改它们。所以你不能像在基于数组的迭代实现中那样执行就地交换。相反,您需要编写一个函数,将您的原始列表作为参数,并返回其所需更改的独立副本。
例如,看看内置功能rev
。它会返回您传递给它的任何列表的反转版本,但它不会(实际上,它不会改变原始列表的结构)。
在这种情况下,你可能需要一个功能min(xs)
找到最小的元素x
在xs
和功能remove(x,xs)
返回的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)
现在只是lessThan(x,y)
替换您min(xs)
功能x < y
任何实例。
更好的是,编写一个版本selSort(list,comp)
,它将比较函数comp
作为参数。然后你可以通过(op <)
执行一个标准排序,lessThan
执行这个“用扭曲排序”,甚至可以用它排序非整数列表(只要你给它一个相应类型的比较函数)。
谢谢你的回应,这肯定会有帮助。我最大的问题是弄清楚如何让选择排序工作。在java中,我将它编程到它将遍历数组的位置,进行交换,更新我的索引并递归。在sml中,我没有奢侈的索引和交换(据我所知)。所以,我不知道如何设置这个。 – MCR 2012-02-24 01:38:58
对不起,我以为这只是把你扔掉的“扭曲”。我会更新我的答案。 – 2012-02-24 01:42:44
天才。这帮了一大笔钱。谢谢。 – MCR 2012-02-24 16:17:01