Rust の Vec<T>
(正確には Deref<Target = [T]>
) は sort
や sort_unstable
といったメソッドを持ちますが, 配列そのものは変更せずソートした順のインデックスの配列が欲しいことがあります. そんなときはこちら:
fn argsort<T: Ord>(v: &[T]) -> Vec<usize> {
let mut idx = (0..v.len()).collect::<Vec<_>>();
idx.sort_unstable_by(|&i, &j| v[i].cmp(&v[j]));
idx
}
最も効率的か若干自信がないですが... 安定ソートが欲しい場合は unstable を外してください.
使用例:
fn main() {
let mut v = [-5, 4, 1, -3, 2];
let idx = argsort(&v);
for i in idx.into_iter() {
println!("v[{}] = {}", i, v[i]);
}
}