use std::time::{ Instant, Duration };
pub trait GnomeSort<T: PartialEq + PartialOrd + Clone + Copy> {
fn gnome_sort(&mut self);
fn gnome_sort_timed(&mut self) -> Duration;
fn gnome_sort_stepped(&mut self) -> Vec<Vec<T>>;
fn gnome_sort_stepped_and_timed(&mut self) -> (Vec<Vec<T>>, Duration);
}
impl<T> GnomeSort<T> for Vec<T>
where T: PartialEq + PartialOrd + Clone + Copy,
{
fn gnome_sort(&mut self) {
if self.len() <= 1 {
return;
}
let mut i = 1;
while i < self.len() {
if self[i] < self[i-1] {
let tmp = self[i];
self[i] = self[i-1];
self[i-1] = tmp;
if i > 1 {
i -= 1;
}
} else {
i += 1;
}
}
}
fn gnome_sort_timed(&mut self) -> Duration {
let time = Instant::now();
if self.len() <= 1 {
return time.elapsed();
}
let mut i = 1;
while i < self.len() {
if self[i] < self[i-1] {
let tmp = self[i];
self[i] = self[i-1];
self[i-1] = tmp;
if i > 1 {
i -= 1;
}
} else {
i += 1;
}
}
return time.elapsed();
}
fn gnome_sort_stepped(&mut self) -> Vec<Vec<T>> {
let mut steps = vec![self.clone()];
if self.len() <= 1 {
return steps;
}
let mut i = 1;
while i < self.len() {
if self[i] < self[i-1] {
let tmp = self[i];
self[i] = self[i-1];
self[i-1] = tmp;
steps.push(self.clone());
if i > 1 {
i -= 1;
}
} else {
i += 1;
}
}
return steps;
}
fn gnome_sort_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 mut i = 1;
while i < self.len() {
if self[i] < self[i-1] {
let tmp = self[i];
self[i] = self[i-1];
self[i-1] = tmp;
steps.push(self.clone());
if i > 1 {
i -= 1;
}
} else {
i += 1;
}
}
return (steps, time.elapsed());
}
}
pub fn gnome_sort<T>(mut arr: Vec<T>) -> Vec<T>
where T: PartialEq + PartialOrd + Clone + Copy,
{
if arr.len() <= 1 {
return arr;
}
let mut i = 1;
while i < arr.len() {
if arr[i] < arr[i-1] {
let tmp = arr[i];
arr[i] = arr[i-1];
arr[i-1] = tmp;
if i > 1 {
i -= 1;
}
} else {
i += 1;
}
}
return arr;
}
pub fn gnome_sort_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 mut i = 1;
while i < arr.len() {
if arr[i] < arr[i-1] {
let tmp = arr[i];
arr[i] = arr[i-1];
arr[i-1] = tmp;
if i > 1 {
i -= 1;
}
} else {
i += 1;
}
}
(arr, time.elapsed())
}
pub fn gnome_sort_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 mut i = 1;
while i < arr.len() {
if arr[i] < arr[i-1] {
let tmp = arr[i];
arr[i] = arr[i-1];
arr[i-1] = tmp;
steps.push(arr.clone());
if i > 1 {
i -= 1;
}
} else {
i += 1;
}
}
(arr, steps)
}
pub fn gnome_sort_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 mut i = 1;
while i < arr.len() {
if arr[i] < arr[i-1] {
let tmp = arr[i];
arr[i] = arr[i-1];
arr[i-1] = tmp;
steps.push(arr.clone());
if i > 1 {
i -= 1;
}
} else {
i += 1;
}
}
(arr, steps, time.elapsed())
}