内置 sort/4 的快速替代品

Fast alternative to built-in sort/4

我正在寻找 sort/4 的替代品。我目前无法使用内置版本。

如果可用,我需要的语法将如下所示 sort(1, @>=, List, Sorted)。列表中的元素如下所示 ([Value:x:y,z:a]:[], ...)。结果必须根据 Value 参数按降序排序。

用于测试目的的示例列表:

[ [16:x:y,z:a]:[], [64:x:y,z:a]:[], [4:x:y,z:a]:[], [1024:x:y,z:a]:[], [0:x:y,z:a]:[], [100:x:y,z:a]:[], [50:x:y,z:a]:[], [-100:x:y,z:a]:[], [0:x:y,z:a]:[] ]

只需提取密钥,将其放在结构的前面,调用 sort/2(或 msort/2,以避免丢失重复项),然后从排序列表中删除密钥。

相同的代码(列表访问)可用于将密钥放在前面和将其删除。最后一步将反转列表,以降序排列。

alternative_sort(Structs, Sorted) :-
  structs_keyed(Structs, Keyed),
  sort(Keyed, Temp),
  structs_keyed(TempR, Temp),
  reverse(TempR, Sorted).

structs_keyed(Sorted, Temp) :- % assume library(yall) available
  maplist([S,K]>>(S=([Value|_]:_),K=Value/S), Sorted, Temp).

是真的,因为排序键值是第一个值元素,可以减少到

alternative_sort(Structs, Sorted) :-
  sort(Structs, Ascending),
  reverse(Ascending, Sorted).