pub fn sort(slice: &mut [u32]) {
if slice.len() <= 1 {
return;
}
let max = find_max(slice);
if max > 1_000_000 {
slice.sort_unstable();
return;
}
let mut count = vec![0; (max + 1) as usize];
for &value in slice.iter() {
count[value as usize] += 1;
}
for i in 1..count.len() {
count[i] += count[i - 1];
}
let mut output = vec![0; slice.len()];
for &value in slice.iter().rev() {
count[value as usize] -= 1;
output[count[value as usize]] = value;
}
slice.copy_from_slice(&output);
}
fn find_max(slice: &[u32]) -> u32 {
slice.iter().max().copied().unwrap_or(0)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_empty_slice() {
let mut arr: Vec<u32> = vec![];
sort(&mut arr);
assert_eq!(arr, Vec::<u32>::new());
}
#[test]
fn test_single_element() {
let mut arr = vec![1];
sort(&mut arr);
assert_eq!(arr, vec![1]);
}
#[test]
fn test_sorted_array() {
let mut arr = vec![1, 2, 3, 4, 5];
sort(&mut arr);
assert_eq!(arr, vec![1, 2, 3, 4, 5]);
}
#[test]
fn test_reverse_sorted() {
let mut arr = vec![5, 4, 3, 2, 1];
sort(&mut arr);
assert_eq!(arr, vec![1, 2, 3, 4, 5]);
}
#[test]
fn test_random_order() {
let mut arr = vec![3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];
let mut expected = arr.clone();
expected.sort();
sort(&mut arr);
assert_eq!(arr, expected);
}
#[test]
fn test_duplicate_elements() {
let mut arr = vec![3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];
let mut expected = arr.clone();
expected.sort();
sort(&mut arr);
assert_eq!(arr, expected);
}
#[test]
fn test_large_array() {
let mut arr: Vec<u32> = (0..1000).rev().collect();
let mut expected = arr.clone();
expected.sort();
sort(&mut arr);
assert_eq!(arr, expected);
}
#[test]
fn test_all_equal() {
let mut arr = vec![1, 1, 1, 1, 1];
sort(&mut arr);
assert_eq!(arr, vec![1, 1, 1, 1, 1]);
}
#[test]
fn test_sparse_array() {
let mut arr = vec![2, 1000, 5, 20000, 3];
sort(&mut arr);
assert_eq!(arr, vec![2, 3, 5, 1000, 20000]);
}
#[test]
fn test_stability() {
#[derive(Debug, Clone, PartialEq)]
struct Pair {
key: u32,
original_index: usize,
}
let pairs = vec![
Pair {
key: 1,
original_index: 0,
},
Pair {
key: 1,
original_index: 1,
},
Pair {
key: 2,
original_index: 2,
},
Pair {
key: 2,
original_index: 3,
},
];
let mut values: Vec<u32> = pairs.iter().map(|p| p.key).collect();
sort(&mut values);
let mut position_map = vec![0; pairs.len()];
let mut count = vec![0; 3];
for &value in values.iter() {
count[value as usize] += 1;
}
for i in 1..count.len() {
count[i] += count[i - 1];
}
for pair in pairs.iter().rev() {
count[pair.key as usize] -= 1;
position_map[pair.original_index] = count[pair.key as usize];
}
for i in 0..pairs.len() - 1 {
for j in i + 1..pairs.len() {
if pairs[i].key == pairs[j].key {
assert!(
position_map[pairs[i].original_index]
< position_map[pairs[j].original_index],
"Stability violated for equal elements at original positions {} and {}",
pairs[i].original_index,
pairs[j].original_index
);
}
}
}
}
#[test]
fn test_zero_and_max() {
let mut arr = vec![0, u32::MAX, 5, u32::MAX - 1, 0];
sort(&mut arr);
assert_eq!(arr, vec![0, 0, 5, u32::MAX - 1, u32::MAX]);
}
#[test]
fn test_find_max() {
assert_eq!(find_max(&[1, 5, 3, 9, 2]), 9);
assert_eq!(find_max(&[1]), 1);
assert_eq!(find_max(&[u32::MAX, 0, 5]), u32::MAX);
}
#[test]
fn test_small_range() {
let mut arr = vec![2, 1, 0, 2, 1, 0, 1, 2];
sort(&mut arr);
assert_eq!(arr, vec![0, 0, 1, 1, 1, 2, 2, 2]);
}
#[test]
fn test_large_range() {
let mut arr = vec![0, 1000000, 0, 1000000, 0];
sort(&mut arr);
assert_eq!(arr, vec![0, 0, 0, 1000000, 1000000]);
}
}