SML NJ中的插入排序比较函数

SML NJ中的插入排序比较函数,sml,smlnj,Sml,Smlnj,我以前也发过类似的问题,但我想我需要重新表述一下我所问的问题。早些时候,我在我想完成的事情上得到了很大的帮助 所以,我现在想知道的是,如何在代码中传递comp函数,使其可以自定义 我希望能够跑步 insertSorted(5, fn(a, b) => a > b, [8, 6, 3, 1]; insertSorted(5, fn(a, b) => a < b, [8, 6, 3, 1]; 哪个会回来 val it = [8, 6, 5, 3, 1] val it =

我以前也发过类似的问题,但我想我需要重新表述一下我所问的问题。早些时候,我在我想完成的事情上得到了很大的帮助

所以,我现在想知道的是,如何在代码中传递comp函数,使其可以自定义

我希望能够跑步

insertSorted(5, fn(a, b) => a > b, [8, 6, 3, 1];
insertSorted(5, fn(a, b) => a < b, [8, 6, 3, 1];
哪个会回来

val it = [8, 6, 5, 3, 1]
val it = [1, 3, 5, 6, 8]
同时还可以翻转一个标志,并能够运行

insertSorted(5, fn(a, b) => a > b, [8, 6, 3, 1];
insertSorted(5, fn(a, b) => a < b, [8, 6, 3, 1];
以下是我到目前为止的情况:

*插入排序*
有趣的插入排序(x,comp,nil)=[x]
|insertSorted(x,comp,y::ys)=如果x comp y,则y::x::ys,否则y::insertSorted(x,ys);
这是有问题的“公司”:
第2行:如果xcompy,则y::x::ys,否则y::insertSorted(x,ys)

在我看来,
insertSorted
可以是两件事:要么(a)一个函数假设其输入列表按照与给定列表相同的关系排序,因此插入是O(n),要么(b)一个函数首先根据关系对输入列表排序,然后插入元素

我认为(a)是有道理的,尽管它有点脆弱,(b)是有点糟糕:

如果允许您假设您的输入已经排序,那么您的函数是O(n)而不是O(n log n)。您可以将此数据结构称为预排序列表。现在,没有什么可以阻止您将未排序的列表提供给
insertSorted
,这样可能会导致错误。有很多方法可以克服这个问题。但这是另一个话题

如果这是你想要的,那么这就是如何做到的:

fun insertSorted (x, comp, y::ys) =
      if comp (x, y)
      then y :: insertSorted (x, comp, ys)
      else x :: y :: ys
  | insertSorted (x, _, []) = [x]
对此进行测试:

- insertSorted (5, op <, [8,7,6,4,3,2]);
val it = [8,7,6,5,4,3,2] : int list

- insertSorted (5, op >, [2,3,4,6,7,8]);
val it = [2,3,4,5,6,7,8] : int list
- insertUnsorted (5, op <, [1,9,3,4,6,2]);
val it = [9,6,5,4,3,2,1] : int list

- insertUnsorted (5, op >, [1,9,3,4,6,2]);    
val it = [1,2,3,4,5,6,9] : int list
对此进行测试:

- insertSorted (5, op <, [8,7,6,4,3,2]);
val it = [8,7,6,5,4,3,2] : int list

- insertSorted (5, op >, [2,3,4,6,7,8]);
val it = [2,3,4,5,6,7,8] : int list
- insertUnsorted (5, op <, [1,9,3,4,6,2]);
val it = [9,6,5,4,3,2,1] : int list

- insertUnsorted (5, op >, [1,9,3,4,6,2]);    
val it = [1,2,3,4,5,6,9] : int list
-插入传感器(5,op[1,9,3,4,6,2]);
val it=[1,2,3,4,5,6,9]:int list
我认为与排序相比,这个函数不是很有用


对于SML/NJ以外的其他SML编译器中的排序函数,请参见。

在我看来,
insertSorted
可以是两件事:要么(a)一个函数假设其输入列表按照与给定列表相同的关系进行排序,以便插入为O(n),要么(b)一个函数首先根据该关系对输入列表进行排序,然后插入元素

我认为(a)是有道理的,尽管它有点脆弱,(b)是有点糟糕:

如果允许您假设您的输入已经排序,那么您的函数是O(n)而不是O(n log n)。您可以将此数据结构称为预排序列表。现在,没有什么可以阻止您将未排序的列表提供给
insertSorted
,这样可能会导致错误。有很多方法可以克服这个问题。但这是另一个话题

如果这是你想要的,那么这就是如何做到的:

fun insertSorted (x, comp, y::ys) =
      if comp (x, y)
      then y :: insertSorted (x, comp, ys)
      else x :: y :: ys
  | insertSorted (x, _, []) = [x]
对此进行测试:

- insertSorted (5, op <, [8,7,6,4,3,2]);
val it = [8,7,6,5,4,3,2] : int list

- insertSorted (5, op >, [2,3,4,6,7,8]);
val it = [2,3,4,5,6,7,8] : int list
- insertUnsorted (5, op <, [1,9,3,4,6,2]);
val it = [9,6,5,4,3,2,1] : int list

- insertUnsorted (5, op >, [1,9,3,4,6,2]);    
val it = [1,2,3,4,5,6,9] : int list
对此进行测试:

- insertSorted (5, op <, [8,7,6,4,3,2]);
val it = [8,7,6,5,4,3,2] : int list

- insertSorted (5, op >, [2,3,4,6,7,8]);
val it = [2,3,4,5,6,7,8] : int list
- insertUnsorted (5, op <, [1,9,3,4,6,2]);
val it = [9,6,5,4,3,2,1] : int list

- insertUnsorted (5, op >, [1,9,3,4,6,2]);    
val it = [1,2,3,4,5,6,9] : int list
-插入传感器(5,op[1,9,3,4,6,2]);
val it=[1,2,3,4,5,6,9]:int list
我认为与排序相比,这个函数不是很有用


有关SML/NJ以外的其他SML编译器中的排序函数,请参阅。

非常感谢,这非常清晰。是的,A是正确的,我也同意它不是最有用的函数。这只是我被分配的一个更大项目的一部分。学校项目应该是一个很好的借口,可以用好的选择来过度设计,比如用你发现的任何技术或设计模式来替换所有的内部结构。非常感谢,这提供了很多清晰的信息。是的,A是正确的,我也同意它不是最有用的函数。这只是我被分配的一个更大项目的一部分。学校项目应该是一个很好的借口,可以用好的选择来过度设计,比如用你发现的任何技术或设计模式来替换所有的内部构件。