Compare commits

...

10 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
15 changed files with 248 additions and 57 deletions

5
.drone.yml Normal file
View file

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

View file

@ -1,3 +1,30 @@
<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)

4
Cargo.lock generated
View file

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

View file

@ -1,6 +1,6 @@
[package]
name = "sorting"
version = "0.1.0"
name = "algo"
version = "0.5.1"
authors = ["Jan Christian Grünhage <jan.christian@gruenhage.xyz>"]
[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.
[![Build Status](https://drone.jcg.re/api/badges/jcgruenhage/algo/status.svg)](https://drone.jcg.re/jcgruenhage/algo)

View file

@ -1,25 +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;
}
println!("{:?}", vector);
}
return Ok(vector);
}
}

View file

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

View file

@ -1,16 +1,82 @@
mod algorithms;
mod sorting;
use algorithms::insertionsort::Insertionsort;
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 Insertionsort::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) {

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

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