From a9d98d826ac5241294c379f29c215becd6e1dc67 Mon Sep 17 00:00:00 2001 From: Artem Chernyak Date: Sun, 15 Dec 2024 19:35:58 -0600 Subject: [PATCH] add rust quicksort (#292) * add rust quicksort * remove binary search from quicksort --- 04_quicksort/rust/Cargo.lock | 7 +++ 04_quicksort/rust/Cargo.toml | 6 +++ 04_quicksort/rust/src/main.rs | 98 +++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 04_quicksort/rust/Cargo.lock create mode 100644 04_quicksort/rust/Cargo.toml create mode 100644 04_quicksort/rust/src/main.rs diff --git a/04_quicksort/rust/Cargo.lock b/04_quicksort/rust/Cargo.lock new file mode 100644 index 0000000..fee3150 --- /dev/null +++ b/04_quicksort/rust/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "quicksort" +version = "0.1.0" diff --git a/04_quicksort/rust/Cargo.toml b/04_quicksort/rust/Cargo.toml new file mode 100644 index 0000000..c33b510 --- /dev/null +++ b/04_quicksort/rust/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "quicksort" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/04_quicksort/rust/src/main.rs b/04_quicksort/rust/src/main.rs new file mode 100644 index 0000000..1884323 --- /dev/null +++ b/04_quicksort/rust/src/main.rs @@ -0,0 +1,98 @@ +fn rec_sum(list: &[usize]) -> usize { + match list.get(0) { + Some(x) => x + rec_sum(&list[1..]), + None => 0, + } +} + +fn rec_count(list: &[T]) -> usize { + match list.get(0) { + Some(_) => 1 + rec_count(&list[1..]), + None => 0, + } +} + +fn maximum(list: &[T]) -> Option<&T> { + match list.get(0) { + Some(x) => match maximum(&list[1..]) { + Some(max) => { + if x > max { + Some(x) + } else { + Some(max) + } + } + None => Some(x), + }, + None => None, + } +} + +fn quicksort(list: &Vec) -> Vec { + if list.len() < 2 { + list.to_vec() + } else { + let pivot = &list[0]; + + let mut less = vec![]; + let mut greater = vec![]; + + for x in &list[1..] { + if x <= pivot { + less.push(x.clone()); + } else { + greater.push(x.clone()); + } + } + + let mut new = Vec::with_capacity(list.len()); + new.append(&mut quicksort(&less)); + new.push(pivot.clone()); + new.append(&mut quicksort(&greater)); + new + } +} + +fn main() { + let list = vec![10, 5, 2, 12, 3]; + + println!("quicksort: {:?}", quicksort(&list)); + println!("sum: {}", rec_sum(&list)); + println!("count: {}", rec_count(&list)); + println!("maximum: {:?}", maximum(&list)); +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn simple_rec_sum() { + let list = [2, 4, 6]; + let expected = 12; + + let result = rec_sum(&list); + + assert_eq!(result, expected); + } + + #[test] + fn simple_rec_count() { + let list = [2, 4, 6]; + let expected = 3; + + let result = rec_count(&list); + + assert_eq!(result, expected); + } + + #[test] + fn simple_maximum() { + let list = [2, 4, 6, 3]; + let expected = 6; + + let result = maximum(&list); + + assert_eq!(result, Some(&expected)); + } +}