#快速排序 #选择 #第n个元素 #quickselect #pdqsort

无std pdqselect

根据Orson Peters的Pattern Defeating Quickselect,选择切片中的第k个最小元素。

2个版本

0.1.1 2021年11月15日
0.1.0 2017年10月20日

算法类别中排名第493

Download history 3219/week @ 2024-03-14 3892/week @ 2024-03-21 3525/week @ 2024-03-28 3486/week @ 2024-04-04 3818/week @ 2024-04-11 3107/week @ 2024-04-18 2879/week @ 2024-04-25 2938/week @ 2024-05-02 3069/week @ 2024-05-09 3320/week @ 2024-05-16 2484/week @ 2024-05-23 3006/week @ 2024-05-30 3121/week @ 2024-06-06 2928/week @ 2024-06-13 3197/week @ 2024-06-20 2879/week @ 2024-06-27

每月下载量达12,688次
113个crate(9个直接使用)中使用

Apache-2.0/MIT

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));

无运行时依赖