Compare commits

...

13 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
Jan Christian Grünhage c370cc4486 docs: update changelog 2017-08-27 18:56:04 +02:00
Jan Christian Grünhage b607608b85 feat: add quicksort 2017-08-27 18:52:51 +02:00
Jan Christian Grünhage 15d253d49c chore: remove debug log 2017-08-27 17:36:44 +02:00
Jan Christian Grünhage 9f847fe038 docs: update changelog 2017-08-27 17:27:52 +02:00
Jan Christian Grünhage 6659387d40 feat: add insertionsort 2017-08-27 17:26:29 +02:00
Jan Christian Grünhage 62f1b27dff refactor: cargo fmt 2017-08-27 17:26:01 +02:00
14 changed files with 262 additions and 35 deletions

5
.drone.yml Normal file
View file

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

View file

@ -1,3 +1,40 @@
<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>
## v0.4.0 (2017-08-27)
#### Features
* add quicksort ([b607608b](b607608b))
<a name="v0.3.0"></a>
## v0.3.0 (2017-08-27)
#### Features
* add insertionsort ([6659387d](6659387d))
<a name="v0.2.0"></a> <a name="v0.2.0"></a>
## v0.2.0 (2017-08-27) ## v0.2.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,7 +0,0 @@
pub trait Algorithm {
fn sort(vector: Vec<i32>) -> Result<Vec<i32>, &'static str>;
}
pub mod bubblesort;
pub mod mergesort;

View file

@ -1,16 +1,82 @@
mod algorithms; mod sorting;
use algorithms::mergesort::Mergesort; 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 Mergesort::sort(unsorted) { }
Ok(v) => v,
Err(e) => { fn demo_sorting() {
println!("Something went wrong! {}", e); let unsorted: Vec<i32> = vec![
return; 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!("{:?}", sorted); 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) {
@ -15,4 +15,4 @@ impl Algorithm for Bubblesort {
} }
return Ok(vector); return Ok(vector);
} }
} }

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,13 +17,13 @@ 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),
}; };
let mut result: Vec<i32> = Vec::new(); let mut result: Vec<i32> = Vec::new();
@ -57,4 +57,4 @@ impl Algorithm for Mergesort {
return Ok(result); return Ok(result);
} }
} }
} }

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;
}

59
src/sorting/quick.rs Normal file
View file

@ -0,0 +1,59 @@
use sorting::Algorithm;
pub struct Sort;
impl Algorithm for Sort {
fn sort(mut vector: Vec<i32>) -> Result<Vec<i32>, &'static str> {
let pivot = match vector.pop() {
Some(v) => v,
None => return Ok(Vec::new()),
};
let mut pivots: Vec<i32> = Vec::new();
pivots.push(pivot);
let mut smaller: Vec<i32> = Vec::new();
let mut larger: Vec<i32> = Vec::new();
while vector.len() != 0 {
let element = match vector.pop() {
Some(v) => v,
None => {
return Err(
"Vector had a length not equal to 0, but still had no more element in it. This point should not be reachable.",
)
}
};
if element < pivot {
smaller.push(element);
} else if element > pivot {
larger.push(element);
} else {
pivots.push(element);
}
}
let mut result: Vec<i32> = Vec::new();
for v in match Sort::sort(smaller) {
Ok(v) => v,
Err(e) => return Err(e),
}
{
result.push(v);
}
for v in pivots {
result.push(v);
}
for v in match Sort::sort(larger) {
Ok(v) => v,
Err(e) => return Err(e),
}
{
result.push(v);
}
return Ok(result);
}
}

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);
}
}