pub fn bubble<T: Ord>(slice: &mut [T]) {
let mut n = slice.len();
while n > 1 {
let mut newn = 0;
for i in 1..n {
if slice[i - 1] > slice[i] {
slice.swap(i - 1, i);
newn = i;
}
}
n = newn;
}
}
pub fn quick_partition<T: Ord>(slice: &mut [T]) -> usize {
let n = slice.len();
let mut lo = 0;
let mut hi = n - 1;
loop {
while slice[lo] < slice[n - 1] {
lo += 1;
}
while hi > 0 && slice[hi] > slice[n - 1] {
hi -= 1;
}
if lo >= hi {
break;
} else {
slice.swap(lo, hi);
}
}
slice.swap(lo, n - 1);
lo
}
pub fn quick<T: Ord>(slice: &mut [T]) {
if slice.len() > 1 {
let partition = quick_partition(slice);
quick(&mut slice[..partition]);
quick(&mut slice[(partition + 1)..]);
}
}
#[cfg(test)]
mod tests {
use super::bubble;
use super::quick;
#[test]
fn bubble_test() {
let mut data = [4, 2, 1, 8, 7, 9, -11];
bubble(&mut data);
assert_eq!(data, [-11, 1, 2, 4, 7, 8, 9]);
}
#[test]
fn quick_test() {
let mut data = [6, 7, 3, 5, 4, -12];
quick(&mut data);
assert_eq!(data, [-12, 3, 4, 5, 6, 7]);
}
}