我想在Rust中按预定义的顺序就地排序(重新排序)一个Vec
。
例如:
let i = vec![0, 3, 2, 1];
let mut v = vec!["a", "b", "c", "d"];
v.sort_by_indices(&i);
assert_eq!(v, &["a", "d", "c", "b"]);
我想就地执行此操作,在我的用例中,v
占用大量内存。
此问题是How to get the indices that would sort a Vec?的后续问题
我想在Rust中按预定义的顺序就地排序(重新排序)一个Vec
。
例如:
let i = vec![0, 3, 2, 1];
let mut v = vec!["a", "b", "c", "d"];
v.sort_by_indices(&i);
assert_eq!(v, &["a", "d", "c", "b"]);
我想就地执行此操作,在我的用例中,v
占用大量内存。
此问题是How to get the indices that would sort a Vec?的后续问题
3条答案
按热度按时间oxiaedzo1#
一个就地实现是棘手的,但可能在O(n)时间内。它的工作原理是追逐索引和交换元素,直到它回到它开始的地方。不幸的是,这确实需要暂存空间来跟踪哪些元素已经排序。下面是一个实现,如果允许使用索引数组,它可以重用索引数组:
看看它在playground上的工作(@Jmb进行了改进)。
否则,您将需要单独分配临时空间(可能是
BitVec
)。如果可以在不跟踪排序元素的情况下使用此方法,请随意进行注解或编辑。kxeu7u2r2#
以同样的方式,它足以实现自己
uklbhaso3#
您可以创建
HashMap
或BTreeMap
***查找表***并将其用作密钥搜索器:Playground