Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions src/sorting/bead_sort.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
//Bead sort only works for sequences of non-negative integers.
//https://en.wikipedia.org/wiki/Bead_sort
pub fn bead_sort(a: &mut [usize]) {
// An empty slice has no maximum to seed the bead grid with.
if a.is_empty() {
return;
}

// Find the maximum element
let mut max = a[0];
(1..a.len()).for_each(|i| {
Expand Down Expand Up @@ -56,4 +61,28 @@ mod tests {
bead_sort(&mut ve2);
assert!(is_sorted(&ve2) && have_same_elements(&ve2, &cloned));
}

#[test]
fn empty() {
let mut ve3: Vec<usize> = vec![];
let cloned = ve3.clone();
bead_sort(&mut ve3);
assert!(is_sorted(&ve3) && have_same_elements(&ve3, &cloned));
}

#[test]
fn one_element() {
let mut ve4: [usize; 1] = [4];
let cloned = ve4;
bead_sort(&mut ve4);
assert!(is_sorted(&ve4) && have_same_elements(&ve4, &cloned));
}

#[test]
fn all_zeroes() {
let mut ve5: [usize; 3] = [0, 0, 0];
let cloned = ve5;
bead_sort(&mut ve5);
assert!(is_sorted(&ve5) && have_same_elements(&ve5, &cloned));
}
}
23 changes: 16 additions & 7 deletions src/sorting/bogo_sort.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,8 @@ use std::time::{SystemTime, UNIX_EPOCH};
const DEFAULT: u64 = 4294967296;

fn is_sorted<T: Ord>(arr: &[T], len: usize) -> bool {
for i in 0..len - 1 {
if arr[i] > arr[i + 1] {
return false;
}
}

true
// `windows` yields nothing below two elements, where `0..len - 1` underflowed.
arr[..len].windows(2).all(|pair| pair[0] <= pair[1])
}

#[cfg(target_pointer_width = "64")]
Expand Down Expand Up @@ -70,4 +65,18 @@ mod tests {
assert!(arr[i] <= arr[i + 1]);
}
}

#[test]
fn empty() {
let mut arr: Vec<i32> = vec![];
bogo_sort(&mut arr);
assert!(arr.is_empty());
}

#[test]
fn one_element() {
let mut arr = [7];
bogo_sort(&mut arr);
assert_eq!(&arr, &[7]);
}
}
22 changes: 22 additions & 0 deletions src/sorting/comb_sort.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
pub fn comb_sort<T: Ord>(arr: &mut [T]) {
// `gap` is clamped to at least 1 below, so `arr.len() - gap` would underflow
// on an empty slice.
if arr.len() < 2 {
return;
}

let mut gap = arr.len();
let shrink = 1.3;
let mut sorted = false;
Expand Down Expand Up @@ -51,4 +57,20 @@ mod tests {
comb_sort(&mut ve3);
assert!(is_sorted(&ve3) && have_same_elements(&ve3, &cloned));
}

#[test]
fn empty() {
let mut ve4: Vec<u8> = vec![];
let cloned = ve4.clone();
comb_sort(&mut ve4);
assert!(is_sorted(&ve4) && have_same_elements(&ve4, &cloned));
}

#[test]
fn one_element() {
let mut ve5 = vec![3];
let cloned = ve5.clone();
comb_sort(&mut ve5);
assert!(is_sorted(&ve5) && have_same_elements(&ve5, &cloned));
}
}
17 changes: 16 additions & 1 deletion src/sorting/wave_sort.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ pub fn wave_sort<T: Ord>(arr: &mut [T]) {
let n = arr.len();
arr.sort();

for i in (0..n - 1).step_by(2) {
// `saturating_sub` keeps an empty slice from underflowing to `usize::MAX`.
for i in (0..n.saturating_sub(1)).step_by(2) {
arr.swap(i, i + 1);
}
}
Expand Down Expand Up @@ -67,4 +68,18 @@ mod tests {
let expected = vec![10, 5, 20, 15, 25];
assert_eq!(&array, &expected);
}

#[test]
fn empty() {
let mut array: Vec<i32> = vec![];
wave_sort(&mut array);
assert!(array.is_empty());
}

#[test]
fn one_element() {
let mut array = vec![42];
wave_sort(&mut array);
assert_eq!(&array, &[42]);
}
}