#排序 #外部 #数据流 #合并 #归并排序

external_sort

为结构体提供外部排序功能,允许快速排序非常大的数据流

6 个版本

0.1.2 2019 年 7 月 3 日
0.1.1 2018 年 6 月 25 日
0.0.3 2018 年 6 月 19 日

#1150 in 算法

29 每月下载次数

MIT 许可证

14KB
200

external_sort

为结构体提供外部排序功能,允许快速排序极大数据流。

用法

将以下内容添加到您的 Cargo.toml

[dependencies]
external_sort = "^0.1.1"

并将其添加到您的 crate 根目录

extern crate external_sort;

示例

以下示例展示了如何使用 external_sort 对简单结构体向量进行排序。

请注意,您的结构体必须 impl OrdClone,以及 serdeSerializeDeserialize 特性。此外,为了让 external_sort 跟踪其内存缓冲区使用情况,您的结构体必须能够报告其大小(通过 external_sort::ExternallySortable

extern crate external_sort;
#[macro_use]
extern crate serde_derive;

use external_sort::{ExternalSorter, ExternallySortable};

#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, PartialOrd, Ord)]
struct Num {
    the_num: u32,
}

impl Num {
    fn new(num: u32) -> Num {
        Num { the_num: num }
    }
}

impl ExternallySortable for Num {
    fn get_size(&self) -> u64 {
        4
    }
}

fn main() {
    let unsorted = vec![
        Num::new(5),
        Num::new(2),
        Num::new(1),
        Num::new(3),
        Num::new(4),
    ];
    let sorted = vec![
        Num::new(1),
        Num::new(2),
        Num::new(3),
        Num::new(4),
        Num::new(5),
    ];

    let external_sorter = ExternalSorter::new(16, None);
    let iter = external_sorter.sort(unsorted.into_iter()).unwrap();
    for (idx, i) in iter.enumerate() {
        assert_eq!(i.unwrap().the_num, sorted[idx].the_num);
    }
}

如果您的结构体无法报告其大小,只需从 get_size() 返回 1,然后在调用 ExternalSorter::new() 时传递对象数量(而不是字节数)

依赖关系

~1–2MB
~39K SLoC