feat: demo all algorithms

Add demo code for all currently implemented algorithms, as well as a refactoring of the package structure.
Rename of the mistakenly called insertion sort, which was actually selection sort.

Fixes #1 and Fixes #2
This commit is contained in:
Jan Christian Grünhage 2017-08-29 10:08:42 +02:00
parent c370cc4486
commit 198e154495
11 changed files with 143 additions and 62 deletions

4
Cargo.lock generated
View file

@ -1,4 +1,4 @@
[root]
name = "sorting"
version = "0.1.0"
name = "algo"
version = "0.4.0"

View file

@ -1,6 +1,6 @@
[package]
name = "sorting"
version = "0.1.0"
name = "algo"
version = "0.4.0"
authors = ["Jan Christian Grünhage <jan.christian@gruenhage.xyz>"]
[dependencies]

View file

@ -1,24 +0,0 @@
use algorithms::Algorithm;
pub struct Insertionsort;
impl Algorithm for Insertionsort {
fn sort(mut vector: Vec<i32>) -> Result<Vec<i32>, &'static str> {
for i in 0..vector.len() {
let mut smallest_index = i;
for j in i..vector.len() {
if vector[j] < vector[smallest_index] {
smallest_index = j;
}
}
if i != smallest_index {
let smallest_value = vector[smallest_index];
for j in (i..(smallest_index)).rev() {
vector[j + 1] = vector[j];
}
vector[i] = smallest_value;
}
}
return Ok(vector);
}
}

View file

@ -1,9 +0,0 @@
pub trait Algorithm {
fn sort(vector: Vec<i32>) -> Result<Vec<i32>, &'static str>;
}
pub mod bubblesort;
pub mod mergesort;
pub mod insertionsort;
pub mod quicksort;

View file

@ -1,16 +1,82 @@
mod algorithms;
mod sorting;
use algorithms::quicksort::Quicksort;
use algorithms::Algorithm;
use sorting::*;
use sorting::Algorithm;
fn main() {
let unsorted: Vec<i32> = vec![2498, 29687, 24, 5, 94545, 8, 51, 152, 48, 871, 5];
let sorted = match Quicksort::sort(unsorted) {
Ok(v) => v,
Err(e) => {
println!("Something went wrong! {}", e);
return;
}
};
println!("{:?}", sorted);
demo_sorting();
}
fn demo_sorting() {
let unsorted: Vec<i32> = vec![
2498,
29687,
24,
94545,
8,
51,
152,
871,
5,
6557,
216,
75986,
48,
526,
15,
6,
78,
];
println!("Unsorted array: {:?}", unsorted);
println!(
"Bubblesort : {:?}",
match bubble::Sort::sort(unsorted.clone()) {
Ok(v) => v,
Err(e) => {
println!("Something went wrong! {}", e);
return;
}
}
);
println!(
"Selectionsort : {:?}",
match selection::Sort::sort(unsorted.clone()) {
Ok(v) => v,
Err(e) => {
println!("Something went wrong! {}", e);
return;
}
}
);
println!(
"Insertionsort : {:?}",
match insertion::Sort::sort(unsorted.clone()) {
Ok(v) => v,
Err(e) => {
println!("Something went wrong! {}", e);
return;
}
}
);
println!(
"Mergesort : {:?}",
match merge::Sort::sort(unsorted.clone()) {
Ok(v) => v,
Err(e) => {
println!("Something went wrong! {}", e);
return;
}
}
);
println!(
"Quicksort : {:?}",
match quick::Sort::sort(unsorted.clone()) {
Ok(v) => v,
Err(e) => {
println!("Something went wrong! {}", e);
return;
}
}
);
}

View file

@ -1,8 +1,8 @@
use algorithms::Algorithm;
use sorting::Algorithm;
pub struct Bubblesort;
pub struct Sort;
impl Algorithm for Bubblesort {
impl Algorithm for Sort {
fn sort(mut vector: Vec<i32>) -> Result<Vec<i32>, &'static str> {
for i in 0..(vector.len()) {
for j in 0..(vector.len() - i - 1) {

View file

@ -1,8 +1,8 @@
use algorithms::Algorithm;
use sorting::Algorithm;
pub struct Mergesort;
pub struct Sort;
impl Algorithm for Mergesort {
impl Algorithm for Sort {
fn sort(mut vector: Vec<i32>) -> Result<Vec<i32>, &'static str> {
if vector.len() == 1 {
return Ok(vector);
@ -17,11 +17,11 @@ impl Algorithm for Mergesort {
}
});
}
let first = match Mergesort::sort(vector) {
let first = match Sort::sort(vector) {
Ok(v) => v,
Err(e) => return Err(e),
};
second = match Mergesort::sort(second) {
second = match Sort::sort(second) {
Ok(v) => v,
Err(e) => return Err(e),
};

21
src/sorting/mod.rs Normal file
View file

@ -0,0 +1,21 @@
pub trait Algorithm {
fn sort(vector: Vec<i32>) -> Result<Vec<i32>, &'static str>;
}
pub mod bubble;
pub mod merge;
pub mod selection;
pub mod quick;
pub mod insertion;
pub fn rotate(mut vector: Vec<i32>, from: usize, to: usize) -> Vec<i32> {
if from != to {
let to_value = vector[to];
for j in (from..(to)).rev() {
vector[j + 1] = vector[j];
}
vector[from] = to_value;
}
return vector;
}

View file

@ -1,8 +1,8 @@
use algorithms::Algorithm;
use sorting::Algorithm;
pub struct Quicksort;
pub struct Sort;
impl Algorithm for Quicksort {
impl Algorithm for Sort {
fn sort(mut vector: Vec<i32>) -> Result<Vec<i32>, &'static str> {
let pivot = match vector.pop() {
Some(v) => v,
@ -34,7 +34,7 @@ impl Algorithm for Quicksort {
let mut result: Vec<i32> = Vec::new();
for v in match Quicksort::sort(smaller) {
for v in match Sort::sort(smaller) {
Ok(v) => v,
Err(e) => return Err(e),
}
@ -46,7 +46,7 @@ impl Algorithm for Quicksort {
result.push(v);
}
for v in match Quicksort::sort(larger) {
for v in match Sort::sort(larger) {
Ok(v) => v,
Err(e) => return Err(e),
}

18
src/sorting/selection.rs Normal file
View file

@ -0,0 +1,18 @@
use sorting::*;
pub struct Sort;
impl Algorithm for Sort {
fn sort(mut vector: Vec<i32>) -> Result<Vec<i32>, &'static str> {
for i in 0..vector.len() {
let mut smallest_index = i;
for j in i..vector.len() {
if vector[j] < vector[smallest_index] {
smallest_index = j;
}
}
vector = rotate(vector, i, smallest_index);
}
return Ok(vector);
}
}

9
src/sorting/template.rs Normal file
View file

@ -0,0 +1,9 @@
use sorting::Algorithm;
pub struct Sort;
impl Algorithm for Sort {
fn sort(mut vector: Vec<i32>) -> Result<Vec<i32>, &'static str> {
return Mergesort::sort(vector);
}
}