Compare commits

...

7 commits

Author SHA1 Message Date
Jan Christian Grünhage 6f0ef241f5 docs: update changelog
All checks were successful
the build was successful
2017-09-16 00:05:25 +02:00
Jan Christian Grünhage ce7b5465f5 docs: add build status to readme 2017-09-15 23:59:12 +02:00
Jan Christian Grünhage 48e994a4e9 chore: add ci 2017-09-15 23:57:52 +02:00
Jan Christian Grünhage 5283bc531c chore: bump version number 2017-08-29 10:13:55 +02:00
Jan Christian Grünhage 69a5b4b312 docs: update changelog 2017-08-29 10:13:36 +02:00
Jan Christian Grünhage cb03ff5125 feat: add insertionsort 2017-08-29 10:08:59 +02:00
Jan Christian Grünhage 198e154495 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
2017-08-29 10:08:42 +02:00
15 changed files with 184 additions and 62 deletions

5
.drone.yml Normal file
View file

@ -0,0 +1,5 @@
pipeline:
build:
image: rust
commands:
- cargo run

View file

@ -1,3 +1,20 @@
<a name="v0.5.1"></a>
### v0.5.1 (2017-09-15)
This release only is the addition of CI for test purposes.
<a name="v0.5.0"></a>
## v0.5.0 (2017-08-29)
#### Features
* add insertionsort ([cb03ff51](cb03ff51))
* demo all algorithms ([198e1544](198e1544), closes [#2](2) (and also [#1](1)))
<a name="v0.4.0"></a> <a name="v0.4.0"></a>
## v0.4.0 (2017-08-27) ## v0.4.0 (2017-08-27)

4
Cargo.lock generated
View file

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

View file

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

View file

@ -1 +1,3 @@
Just some sorting algorithm implementations as practice for an exam. If they are useful for you, feel free to use them, under the included license. Just some sorting algorithm implementations as practice for an exam. If they are useful for you, feel free to use them, under the included license.
[![Build Status](https://drone.jcg.re/api/badges/jcgruenhage/algo/status.svg)](https://drone.jcg.re/jcgruenhage/algo)

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 sorting::*;
use algorithms::Algorithm; use sorting::Algorithm;
fn main() { fn main() {
let unsorted: Vec<i32> = vec![2498, 29687, 24, 5, 94545, 8, 51, 152, 48, 871, 5]; demo_sorting();
let sorted = match Quicksort::sort(unsorted) { }
Ok(v) => v,
Err(e) => { fn demo_sorting() {
println!("Something went wrong! {}", e); let unsorted: Vec<i32> = vec![
return; 2498,
} 29687,
}; 24,
println!("{:?}", sorted); 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> { fn sort(mut vector: Vec<i32>) -> Result<Vec<i32>, &'static str> {
for i in 0..(vector.len()) { for i in 0..(vector.len()) {
for j in 0..(vector.len() - i - 1) { for j in 0..(vector.len() - i - 1) {

17
src/sorting/insertion.rs Normal file
View file

@ -0,0 +1,17 @@
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() {
for j in 0..(i) {
if vector[j] > vector[i] {
vector = rotate(vector, j, i);
break;
}
}
}
return Ok(vector);
}
}

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> { fn sort(mut vector: Vec<i32>) -> Result<Vec<i32>, &'static str> {
if vector.len() == 1 { if vector.len() == 1 {
return Ok(vector); 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, Ok(v) => v,
Err(e) => return Err(e), Err(e) => return Err(e),
}; };
second = match Mergesort::sort(second) { second = match Sort::sort(second) {
Ok(v) => v, Ok(v) => v,
Err(e) => return Err(e), 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> { fn sort(mut vector: Vec<i32>) -> Result<Vec<i32>, &'static str> {
let pivot = match vector.pop() { let pivot = match vector.pop() {
Some(v) => v, Some(v) => v,
@ -34,7 +34,7 @@ impl Algorithm for Quicksort {
let mut result: Vec<i32> = Vec::new(); let mut result: Vec<i32> = Vec::new();
for v in match Quicksort::sort(smaller) { for v in match Sort::sort(smaller) {
Ok(v) => v, Ok(v) => v,
Err(e) => return Err(e), Err(e) => return Err(e),
} }
@ -46,7 +46,7 @@ impl Algorithm for Quicksort {
result.push(v); result.push(v);
} }
for v in match Quicksort::sort(larger) { for v in match Sort::sort(larger) {
Ok(v) => v, Ok(v) => v,
Err(e) => return Err(e), 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);
}
}