use std::time::{ Instant, Duration };
pub trait Slowsort<T: PartialEq + PartialOrd + Clone + Copy> {
fn slowsort(&mut self);
fn slowsort_timed(&mut self) -> Duration;
fn slowsort_stepped(&mut self) -> Vec<Vec<T>>;
fn slowsort_stepped_and_timed(&mut self) -> (Vec<Vec<T>>, Duration);
}
impl<T> Slowsort<T> for Vec<T>
where T: PartialEq + PartialOrd + Clone + Copy,
{
fn slowsort(&mut self) {
if self.len() <= 1 {
return;
}
let length = self.len();
slowsort_rec(self, 0, length - 1);
}
fn slowsort_timed(&mut self) -> Duration {
let time = Instant::now();
if self.len() <= 1 {
return time.elapsed();
}
let length = self.len();
slowsort_rec(self, 0, length - 1);
return time.elapsed();
}
fn slowsort_stepped(&mut self) -> Vec<Vec<T>> {
let mut steps = vec![self.clone()];
if self.len() <= 1 {
return steps;
}
let length = self.len();
slowsort_rec_stepped(self, 0, length - 1, &mut steps);
return steps;
}
fn slowsort_stepped_and_timed(&mut self) -> (Vec<Vec<T>>, Duration) {
let time = Instant::now();
let mut steps = vec![self.clone()];
if self.len() <= 1 {
return (steps, time.elapsed());
}
let length = self.len();
slowsort_rec_stepped(self, 0, length - 1, &mut steps);
(steps, time.elapsed())
}
}
pub fn slowsort<T>(mut arr: Vec<T>) -> Vec<T>
where T: PartialEq + PartialOrd + Clone + Copy,
{
if arr.len() <= 1 {
return arr;
}
let length = arr.len();
slowsort_rec(&mut arr, 0, length - 1);
return arr;
}
pub fn slowsort_timed<T>(mut arr: Vec<T>) -> (Vec<T>, Duration)
where T: PartialEq + PartialOrd + Clone + Copy,
{
let time = Instant::now();
if arr.len() <= 1 {
return (arr, time.elapsed());
}
let length = arr.len();
slowsort_rec(&mut arr, 0, length - 1);
(arr, time.elapsed())
}
pub fn slowsort_stepped<T>(mut arr: Vec<T>) -> (Vec<T>, Vec<Vec<T>>)
where T: PartialEq + PartialOrd + Clone + Copy,
{
let mut steps = vec![arr.clone()];
if arr.len() <= 1 {
return (arr, steps);
}
let length = arr.len();
slowsort_rec_stepped(&mut arr, 0, length - 1, &mut steps);
(arr, steps)
}
pub fn slowsort_stepped_and_timed<T>(mut arr: Vec<T>) -> (Vec<T>, Vec<Vec<T>>, Duration)
where T: PartialEq + PartialOrd + Clone + Copy,
{
let time = Instant::now();
let mut steps = vec![arr.clone()];
if arr.len() <= 1 {
return (arr, steps, time.elapsed());
}
let length = arr.len();
slowsort_rec_stepped(&mut arr, 0, length - 1, &mut steps);
(arr, steps, time.elapsed())
}
fn slowsort_rec<T>(arr: &mut Vec<T>, i: usize, j: usize)
where T: PartialEq + PartialOrd + Clone + Copy,
{
if i >= j {
return;
}
let m = (i + j) / 2;
slowsort_rec(arr, i, m);
slowsort_rec(arr, m+1, j);
if arr[m] > arr[j] {
arr.swap(m, j);
}
slowsort_rec(arr, i, j-1);
}
fn slowsort_rec_stepped<T>(arr: &mut Vec<T>, i: usize, j: usize, steps: &mut Vec<Vec<T>>)
where T: PartialEq + PartialOrd + Clone + Copy,
{
if i >= j {
return;
}
let m = (i + j) / 2;
slowsort_rec(arr, i, m);
slowsort_rec(arr, m+1, j);
if arr[m] > arr[j] {
arr.swap(m, j);
steps.push(arr.clone());
}
slowsort_rec(arr, i, j-1);
}