Skip to content

Instantly share code, notes, and snippets.

@mykhailokrainik
Created October 19, 2022 18:16
Show Gist options
  • Save mykhailokrainik/cf92a17ce7a393b0779f3142a10910d5 to your computer and use it in GitHub Desktop.
Save mykhailokrainik/cf92a17ce7a393b0779f3142a10910d5 to your computer and use it in GitHub Desktop.
Quicksort algorithm implemented on rust
pub fn quick_sort<T: Clone + PartialOrd>(arr: &[T]) -> Vec<T> {
if arr.len() <= 1 {
return arr.to_vec();
}
if arr.len() == 2 {
let a = arr[0].clone();
let b = arr[1].clone();
return if a < b { vec![a, b] } else { vec![b, a] };
}
let pivot = arr.get(0).cloned().unwrap();
let mut less = Vec::default();
let mut greater = Vec::default();
for a in arr.into_iter().skip(1).map(|a| a.to_owned()) {
if a < pivot {
less.push(a);
} else {
greater.push(a);
}
}
[quick_sort(&less), vec![pivot], quick_sort(&greater)].concat()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_case_0() {
let result = quick_sort::<i32>(&[]);
assert_eq!(result, &[]);
}
#[test]
fn it_case_1() {
let result = quick_sort(&[3]);
assert_eq!(result, vec![3]);
}
#[test]
fn it_case_2() {
let result = quick_sort(&[5, 3]);
assert_eq!(result, vec![3, 5]);
}
#[test]
fn it_case_n() {
let result = quick_sort(&[20, 5, 4, 10, 16, 2, 3]);
assert_eq!(result, vec![2, 3, 4, 5, 10, 16, 20]);
}
#[test]
fn it_case_negative() {
let result = quick_sort(&[5, 4, -10, -16, 2, 3, 0]);
assert_eq!(result, vec![-16, -10, 0, 2, 3, 4, 5]);
}
}
@mykhailokrainik
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment