最简单的解决方法是使用vecsort
. 一般来说,我建议始终在列表上使用向量,除非增量构建列表。构造列表后,将其作为向量从函数中返回会更简洁。
L = List([0, 1, 1/2, 1/3, 1/4, 2/3, 3/4]);
listsort(L);
L
给出:(List([0, 1, 1/2, 1/3, 1/4, 2/3, 3/4])
不正确)
L = List([0, 1, 1/2, 1/3, 1/4, 2/3, 3/4]);
vecsort(L)
给出:(List([0, 1/4, 1/3, 1/2, 2/3, 3/4, 1])
正确)
请注意,vecsort
不会修改原始列表,因此如果要更新列表,则需要将输出分配vecsort
回变量。
但是,我建议使用向量。
L = Vec(List([0, 1, 1/2, 1/3, 1/4, 2/3, 3/4]));
vecsort(L)
给出:([0, 1/4, 1/3, 1/2, 2/3, 3/4, 1]
注意没有List
)。
其根本原因是vecsort
使用lex
,但listsort
使用cmp
。我不确定为什么cmp
表现得如此糟糕 - 可能是一个错误,但更有可能是被设计破坏了。
似乎它的listsort
排序顺序与集合使用的顺序相同,并且针对性能而不是用户期望进行了优化。如果您想setsearch
在您的清单上使用,那么您需要将其订购为套装。还有一个vecsearch
用作lex
比较功能的功能。
或许还值得一提的是,两者都vecsort
将vecsearch
用户提供的比较函数作为可选参数。