add rust quicksort (#292)
* add rust quicksort * remove binary search from quicksort
This commit is contained in:
7
04_quicksort/rust/Cargo.lock
generated
Normal file
7
04_quicksort/rust/Cargo.lock
generated
Normal file
@@ -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"
|
||||||
6
04_quicksort/rust/Cargo.toml
Normal file
6
04_quicksort/rust/Cargo.toml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[package]
|
||||||
|
name = "quicksort"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
98
04_quicksort/rust/src/main.rs
Normal file
98
04_quicksort/rust/src/main.rs
Normal file
@@ -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<T>(list: &[T]) -> usize {
|
||||||
|
match list.get(0) {
|
||||||
|
Some(_) => 1 + rec_count(&list[1..]),
|
||||||
|
None => 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn maximum<T: Ord>(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<T: Ord + Clone>(list: &Vec<T>) -> Vec<T> {
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user