SML中是否有标准排序功能?互联网上的文件非常稀缺,我找不到任何文件。
答案 0 :(得分:13)
雷切尔只是部分正确。确实,SML基础库中没有定义排序功能,但是大多数实现扩展了基础库并添加了额外的功能。
因此,MosML同时具有ArraySort和Listsort模块,并且SML / NJ具有带有ListMergeSort实现的LIST_SORT签名。它还在阵列上具有一些其他排序功能,如MosML。有关完整列表,请参阅SML / NJ图书馆手册的toc。
答案 1 :(得分:4)
正如Jesper Reenberg所指出的那样,标准ML编译器各有自己的(非标准的,具有讽刺意味的)排序库。由于这些文档缺少示例,因此以下是如何使用各种模块按升序对字符串列表进行排序:
在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 ,因此我必须以某种方式明确注释我是否正在比较字符串。
在莫斯科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
。
在Poly / ML中,没有用于排序的库,因此您必须定义自己的排序功能。
如果这些排序功能都不够,这里有许多用标准ML编写的其他排序函数:
True QuickSort in Standard ML将naive QuickSort(实际上并非真正的QuickSort)与John Coleman的Hoare's algorithm实施进行比较。
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]
我希望对您有帮助