radsort

Crates.io Docs

radsort is a radix sort implementation for sorting by scalar keys (integers, floats, chars, bools).

All built-in scalar types can be used as sorting keys: Booleans, characters, integers, and floating point-numbers. To sort by multiple keys, put them in a tuple, starting from the most significant key. See [Key] for a full list of supported keys.

This sort can be several times faster than slice::sort and slice::sort_unstable, typically on large slices (hundreds of elements or more). It performs worse on short slices and when using wide keys (16 bytes). See [benchmarks] to get a better picture of the performance characteristics.

radsort is an implementation of LSB radix sort, using counting sort to sort the slice by each digit (byte) of the key. As an optimization, the slice is sorted only by digits which differ between the keys. See the [unopt] module for more details and functions which don't use this optimization.

This implementation is based on radix sort by Pierre Terdiman, published at http://codercorner.com/RadixSortRevisited.htm, with select optimizations published by Michael Herf at http://stereopsis.com/radix.html.

Floating-point numbers

Floating-point number keys are effectively sorted according to their partial order (see [PartialOrd]), with NaN values at the beginning (before the negative infinity) and at the end (after the positive infinity), depending on the sign bit of each NaN.

Examples

Slices of scalar types (integers, floating-point numbers, Booleans, and characters) can be sorted directly: ```rust let mut data = [2i32, -1, 1, 0, -2];

radsort::sort(&mut data);

assert_eq!(data, [-2, -1, 0, 1, 2]); ```

Use a key extraction function to sort other types: ```rust let mut friends = ["Punchy", "Isabelle", "Sly", "Puddles", "Gladys"];

// sort by the length of the string in bytes radsort::sortbykey(&mut friends, |s| s.len());

assert_eq!(friends, ["Sly", "Punchy", "Gladys", "Puddles", "Isabelle"]); ```

To sort by two or more keys, put them in a tuple, starting with the most significant key: ```rust 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::sortbykey(&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 }, ]); ```