-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathquicksort.rs
59 lines (49 loc) · 1.25 KB
/
quicksort.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
pub fn quicksort<T: Ord>(arr: &mut [T]) {
if arr.is_empty() {
return;
}
sort(arr, 0, arr.len() - 1);
}
fn sort<T: Ord>(arr: &mut [T], left: usize, right: usize) {
if left < right {
let pivot_index = partition(arr, left, right);
sort(arr, left, pivot_index);
sort(arr, pivot_index + 1, right);
}
}
fn partition<T: Ord>(arr: &mut [T], left: usize, right: usize) -> usize {
let pivot = right;
let mut p_left = left;
let mut p_right = right - 1;
loop {
while arr[p_left] < arr[pivot] {
p_left += 1;
}
while arr[p_right] > arr[pivot] {
p_right -= 1;
}
if p_left >= p_right {
arr.swap(p_left, pivot);
return p_right;
}
arr.swap(p_left, p_right);
p_left += 1;
p_right -= 1;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn empty() {
let mut empty_vec: Vec<i32> = Vec::new();
quicksort(&mut empty_vec);
assert!(empty_vec.is_empty());
}
#[test]
fn sort() {
let mut arr: Vec<i32> = vec![4, -3, 7, 0, 10, -6, 7, 1];
quicksort(&mut arr);
assert_eq!(arr, vec![-6, -3, 0, 1, 4, 7, 7, 10]);
}
}