#排序 #基数 #计数 #整数 #分配

无需 std radsort

基于标量键(整数、浮点数、字符、布尔值)进行排序的基数排序实现

3 个不稳定版本

新增 0.1.1 2024 年 8 月 19 日
0.1.0 2020 年 4 月 12 日
0.0.0 2020 年 4 月 8 日

算法 中排名 127

Download history 13209/week @ 2024-05-02 10654/week @ 2024-05-09 11677/week @ 2024-05-16 12820/week @ 2024-05-23 13733/week @ 2024-05-30 13381/week @ 2024-06-06 12867/week @ 2024-06-13 11306/week @ 2024-06-20 11931/week @ 2024-06-27 15130/week @ 2024-07-04 14359/week @ 2024-07-11 13436/week @ 2024-07-18 17155/week @ 2024-07-25 13673/week @ 2024-08-01 17831/week @ 2024-08-08 18600/week @ 2024-08-15

每月下载量 69,312
651 crate 中使用(直接使用 8 个)

MIT/Apache 许可协议

文件大小 47KB
代码行数 575 行(不包括注释)

radsort

Crates.io Docs

radsort 是一个基于标量键(整数、浮点数、字符、布尔值)进行排序的基数排序实现。

所有内置标量类型都可以用作排序键:布尔值、字符、整数和浮点数。要按多个键排序,请将它们放入一个元组中,从最重要的键开始。有关支持的键的完整列表,请参阅 Key

  • 最好和最坏情况下的运行时间是 O(n) – 更多详细的性能特征请参阅 基准测试
  • 空间复杂度是 O(n) – 分配临时存储的大小与切片大小相同,对于间接排序,请参阅 sort_by_cached_key
  • 稳定,即不会重新排序相等元素
  • 使用 #![no_std],但需要一个分配器

此排序可能比 slice::sortslice::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 },
]);

无运行时依赖