SML中的标准排序功能?

时间:2013-01-19 06:42:07

标签: sml

SML中是否有标准排序功能?互联网上的文件非常稀缺,我找不到任何文件。

5 个答案:

答案 0 :(得分:13)

雷切尔只是部分正确。确实,SML基础库中没有定义排序功能,但是大多数实现扩展了基础库并添加了额外的功能。

因此,MosML同时具有ArraySortListsort模块,并且SML / NJ具有带有ListMergeSort实现的LIST_SORT签名。它还在阵列上具有一些其他排序功能,如MosML。有关完整列表,请参阅SML / NJ图书馆手册的toc

答案 1 :(得分:4)

正如Jesper Reenberg所指出的那样,标准ML编译器各有自己的(非标准的,具有讽刺意味的)排序库。由于这些文档缺少示例,因此以下是如何使用各种模块按升序对字符串列表进行排序:

  1. 在SML / NJ和MLton中,使用ListMergeSort.sort函数:

    - fun sortStrings ss = ListMergeSort.sort (fn (s : string, t) => s > t) ss;
    [autoloading]
    [library $SMLNJ-LIB/Util/smlnj-lib.cm is stable]
    [autoloading done]
    val sortStrings = fn : string list -> string list
    - sortStrings ["World","Hello"];
    val it = ["Hello","World"] : string list
    

    这个库函数的怪癖是它需要大于"大于"布尔谓词。由于标准ML的>运算符已重载,但默认为 int ,因此我必须以某种方式明确注释我是否正在比较字符串

  2. 在莫斯科ML中,使用Listsort.sort功能:

    - load "Listsort";
    > val it = () : unit
    - fun sortStrings ss = Listsort.sort String.compare ss;
    > val sortStrings = fn : string list -> string list
    - sortStrings ["World", "Hello"];
    > val it = ["Hello", "World"] : string list
    

    这个库的怪癖是莫斯科ML的交互式REPL不会自动加载Listsort。仅在交互式REPL中键入load "Listsort";;在编译程序时,不使用load

  3. 在Poly / ML中,没有用于排序的库,因此您必须定义自己的排序功能。

  4. 如果这些排序功能都不够,这里有许多用标准ML编写的其他排序函数:

    1. True QuickSort in Standard MLnaive QuickSort(实际上并非真正的QuickSort)与John Coleman的Hoare's algorithm实施进行比较。

    2. Rosetta Code's MergeSort in Standard ML

      fun merge cmp ([], ys) = ys
        | merge cmp (xs, []) = xs
        | merge cmp (xs as x::xs', ys as y::ys') =
            case cmp (x, y) of
                 GREATER => y :: merge cmp (xs, ys')
               | _       => x :: merge cmp (xs', ys)
      
      fun sort cmp [] = []
        | sort cmp [x] = [x]
        | sort cmp xs =
          let
            val ys = List.take (xs, length xs div 2)
            val zs = List.drop (xs, length xs div 2)
          in
            merge cmp (sort cmp ys, sort cmp zs)
          end
      

答案 2 :(得分:2)

这是一个标准的快速排序

fun qsort(func) =
    let fun sort [] = []
          | sort (lhd :: ltl) =
                sort (List.filter (fn x => func (x, lhd)) ltl)
              @ [lhd]
              @ sort (List.filter (fn x => not (func(x, lhd)) ltl)
    in sort
    end

只需输入一些比较器(带有两个相同类型的元素并返回布尔值的函数)它会为你返回一个sort函数 如果你有问题,请不要犹豫。 :)

答案 3 :(得分:0)

如何排序列表?你总是可以使用反向来反过来。

- fun sort(L) =
   if L=[] then []
   else if tl(L)=[] then L
   else merge(sort(take(L)), sort(skip(L)));
 val sort = fn : int list -> int list

请参阅here

答案 4 :(得分:0)

这是我的sml排序算法

fun sort list = foldr (fn (x,lst)=> List.filter (fn a => a < x) lst @ [x] @ List.filter (fn a => a >= x) lst ) [] list;

sort [5,1,5,0,2,5,~2,5,~10,0];

output: [~10,~2,0,0,1,2,5,5,5,5]

我希望对您有帮助