diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml new file mode 100644 index 0000000..7abd1bc --- /dev/null +++ b/.github/workflows/check.yaml @@ -0,0 +1,24 @@ +name: Check + +on: + push: + branches: + - main + pull_request: + branches: + - 'main' + +jobs: + check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + - uses: actions-rs/cargo@v1 + with: + command: build + - uses: actions-rs/cargo@v1 + with: + command: test diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eb5a316 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..51a8744 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "rust-algorithms" +version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..48cd477 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "rust-algorithms" +version = "0.1.0" +edition = "2021" diff --git a/src/bubble_sort.rs b/src/bubble_sort.rs new file mode 100644 index 0000000..a5d1ccf --- /dev/null +++ b/src/bubble_sort.rs @@ -0,0 +1,19 @@ +pub fn bubble_sort(mut vector: Vec) -> Vec { + let mut outer_index = 0; + let length = vector.len(); + + while outer_index < length { + let mut inner_index = outer_index + 1; + while inner_index < length { + if vector[inner_index] < vector[inner_index - 1] { + let tmp = vector[inner_index]; + vector[inner_index] = vector[inner_index - 1]; + vector[inner_index - 1] = tmp; + } + inner_index += 1; + } + outer_index += 1; + } + + return vector; +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..6dabab2 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1 @@ +pub mod bubble_sort; diff --git a/tests/bubble_sort.rs b/tests/bubble_sort.rs new file mode 100644 index 0000000..ab7e8ec --- /dev/null +++ b/tests/bubble_sort.rs @@ -0,0 +1,57 @@ +// use rust_algorithms::bubble_sort; +use rust_algorithms::bubble_sort::bubble_sort; + +fn is_sorted(vector: &Vec) -> bool { + let mut previous: Option = None; + for el in vector.iter() { + match previous { + Some(x) => { + if x > *el { + return false; + } + } + _ => { + previous = Some(*el); + } + } + } + + true +} + +#[test] +fn it_works() { + let vector = Vec::new(); + bubble_sort(vector); +} + +#[test] +fn it_works_for_one_element() { + let mut vector: Vec = vec![1]; + vector = bubble_sort(vector); + assert!(is_sorted(&vector)); +} + +#[test] +fn it_works_for_two_elements_sorted() { + let mut vector: Vec = vec![1, 2]; + vector = bubble_sort(vector); + assert!(is_sorted(&vector)); +} + +#[test] +fn it_works_for_two_elements_unsorted() { + let mut vector: Vec = vec![2, 1]; + vector = bubble_sort(vector); + assert!(is_sorted(&vector)); +} + +#[test] +fn it_works_for_a_bigger_vector() { + let mut vector: Vec = vec![ + 213, 12, 123432, 11224, 6867, 32413, 78787653, 1213, 122, 4446, 146575, 1123245, 654654, + 1231, + ]; + vector = bubble_sort(vector); + assert!(is_sorted(&vector)); +}