gpt4 book ai didi

sorting - 根据另一个切片中的键对切片进行排序,而无需分配

转载 作者:行者123 更新时间:2023-12-03 11:42:58 25 4
gpt4 key购买 nike

这不是How can I co-sort two Vecs based on the values in one of the Vecs?的副本,因为permutation crate 的实现分配了。
如何在不分配的情况下根据另一个片的内容对一个片进行排序?

slice1 = [
AAA, BBB, CCC, DDD
]

slice2 = [
12, -3, 6, 17
]

结果:
[BBB, CCC, AAA, DDD]
slice1slice2都不太大(整数,最多约1 KiB,通常小得多),但是这种情况经常可以完成。不需要保留 slice2,因此可以通过对 slice2排序并同时在 slice1上执行相同的操作来实现,但是我做的任何排序实现都比标准库实现的性能差。

最佳答案

可通过以下三种方法访问标准库排序算法:

  • [T]::sort
  • [T]::sort_by(以FnMut(&T, &T) -> Ordering作为编译器)
  • [T]::sort_by_key(采用FnMut(&T) -> K)

  • 当您需要任何类型的非标准排序行为时,后两者非常重要。但是正如您所看到的,您只能访问要排序的切片的元素。
    好吧,您可以使用该引用 &T,将其转换为原始指针,从中减去片基,然后再加上tada:您就有索引!使用索引,您可以查看另一个数组。 (编辑:不,请参见注释。)但是,这仅在算法交换前两个元素之前有效。您还必须复制整数数组中的所有交换。而且标准库根本不向您提供有关交换的“通知”。
    就我所知:在您的方案中,您必须自己分配或编写排序算法。

    如果分配不是硬性限制,而仅仅是性能考虑:您应该衡量一下。
    我想到的一种简单方法:
    let mut vec = slice2.iter().zip(slice1).collect::<Vec<_>>();
    vec.sort();
    这样,您将得到 [(-3, BBB), (6, CCC), (12, AAA), (17, DDD)]作为结果。当然,您可以轻松地从中仅选择第二个元素。当然,还有很多替代解决方案。

    关于sorting - 根据另一个切片中的键对切片进行排序,而无需分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62871380/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com