1

目前,我正在实现一种算法,通过使用 FareySeries(n) 调用我的函数来返回 n 阶的 Farey Series。这很好用,例如调用 L = FareySeries(4) 返回 List([0, 1, 1/2, 1/3, 1/4, 2/3, 3/4]) ,但我需要对列表进行排序。阅读文档,我想

listsort(L)

会做这项工作,但似乎这只适用于整数和浮点数(我手动测试过)。是否有一些内置函数(或参数)用于对包含混合整数和分数的列表进行排序,还是我必须手动对其进行排序?我不需要代码给自己排序,我只想使用,已经实现的;在这里坚持编码的基础知识。

4

1 回答 1

0

最简单的解决方法是使用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比较功能的功能。

或许还值得一提的是,两者都vecsortvecsearch用户提供的比较函数作为可选参数。

于 2019-09-17T21:01:15.113 回答