3 个不稳定版本
新增 0.1.1 | 2024 年 8 月 19 日 |
---|---|
0.1.0 | 2020 年 4 月 12 日 |
0.0.0 | 2020 年 4 月 8 日 |
在 算法 中排名 127
每月下载量 69,312
在 651 个 crate 中使用(直接使用 8 个)
文件大小 47KB
代码行数 575 行(不包括注释)
radsort
radsort
是一个基于标量键(整数、浮点数、字符、布尔值)进行排序的基数排序实现。
所有内置标量类型都可以用作排序键:布尔值、字符、整数和浮点数。要按多个键排序,请将它们放入一个元组中,从最重要的键开始。有关支持的键的完整列表,请参阅 Key
。
- 最好和最坏情况下的运行时间是
O(n)
– 更多详细的性能特征请参阅 基准测试 - 空间复杂度是
O(n)
– 分配临时存储的大小与切片大小相同,对于间接排序,请参阅sort_by_cached_key
- 稳定,即不会重新排序相等元素
- 使用
#![no_std]
,但需要一个分配器
此排序可能比 slice::sort
和 slice::sort_unstable
快几倍,通常在大型切片(数百个元素或更多)上表现更好。在短切片和宽键(16 字节)上表现较差。请参阅 基准测试 以获得更好的性能特征图。
radsort
是 LSB 基数排序的实现,使用计数排序对键的每个数字(字节)进行排序。作为一个优化,只有当键之间的数字不同时才对切片进行排序。有关更多详细信息,请参阅 unopt
模块和未使用此优化的函数。
此实现基于 Pierre Terdiman 的基数排序,发布在 http://codercorner.com/RadixSortRevisited.htm,并包含 Michael Herf 在 http://stereopsis.com/radix.html 上发布的部分优化。
浮点数
浮点数键根据其部分顺序(参见PartialOrd
)进行排序,其中NaN
值位于开头(在负无穷大之前)和结尾(在正无穷大之后),具体取决于每个NaN
的符号位。
示例
标量类型(整数、浮点数、布尔值和字符)的切片可以直接排序
let mut data = [2i32, -1, 1, 0, -2];
radsort::sort(&mut data);
assert_eq!(data, [-2, -1, 0, 1, 2]);
使用键提取函数来排序其他类型
let mut friends = ["Punchy", "Isabelle", "Sly", "Puddles", "Gladys"];
// sort by the length of the string in bytes
radsort::sort_by_key(&mut friends, |s| s.len());
assert_eq!(friends, ["Sly", "Punchy", "Gladys", "Puddles", "Isabelle"]);
要按两个或更多键排序,将它们放入一个元组中,从最重要的键开始
struct Height { feet: u8, inches: u8, }
let mut heights = [
Height { feet: 6, inches: 1 },
Height { feet: 5, inches: 9 },
Height { feet: 6, inches: 0 },
];
// sort by feet, if feet are equal, sort by inches
radsort::sort_by_key(&mut heights, |h| (h.feet, h.inches));
assert_eq!(heights, [
Height { feet: 5, inches: 9 },
Height { feet: 6, inches: 0 },
Height { feet: 6, inches: 1 },
]);