2个版本
0.1.1 | 2021年11月15日 |
---|---|
0.1.0 | 2017年10月20日 |
在算法类别中排名第493
每月下载量达12,688次
在113个crate(9个直接使用)中使用
43KB
440 行
从Rust的pdqsort算法实现(https://doc.rust-lang.net.cn/std/primitive.slice.html#method.sort_unstable_by)改编的quickselect算法。
注意:您可能希望使用Rust官方版本的此算法,select_nth_unstable_by
lib.rs
:
模式击败快速选择
该算法基于Orson Peters发表的“模式击败快速排序”,发布于:https://github.com/orlp/pdqsort。它还大量借鉴了Rust的pdqsort实现(https://github.com/stjepang/pdqsort)和Rust自己的slice::sort_unstable
。
注意:您可能希望使用Rust官方版本的此算法,slice::select_nth_unstable_by
属性
- 最佳运行时间是
O(n)
。 - 最坏运行时间是
O(n log n)
。 - 不分配额外的内存。
- 使用
#![no_std]
。
示例
let mut v = [-5i32, 4, 1, -3, 2];
let k = 3;
pdqselect::select(&mut v, k);
let kth = v[k];
assert!(v[..k].iter().all(|&x| x <= kth));
assert!(v[k+1..].iter().all(|&x| x >= kth));
pdqselect::select_by(&mut v, k, |a, b| b.cmp(a));
let kth = v[k];
assert!(v[..k].iter().all(|&x| x >= kth));
assert!(v[k+1..].iter().all(|&x| x <= kth));
pdqselect::select_by_key(&mut v, k, |k| k.abs());
let kth = v[k].abs();
assert!(v[..k].iter().all(|&x| x.abs() <= kth));
assert!(v[k+1..].iter().all(|&x| x.abs() >= kth));