From 0d0e9a899be30bdcdf6077dec266fce028b7535d Mon Sep 17 00:00:00 2001 From: Meisterlala <6453306+Meisterlala@users.noreply.github.com> Date: Sun, 29 Aug 2021 15:03:09 +0200 Subject: [PATCH] mergesort rewrite in rust --- .gitignore | 5 +- .../Part 1/mergesort/Cargo.lock | 16 ++++ .../Part 1/mergesort/Cargo.toml | 15 ++++ .../Part 1/mergesort/src/main.rs | 77 +++++++++++++++++++ 4 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 Algorithms Specialization/Part 1/mergesort/Cargo.lock create mode 100644 Algorithms Specialization/Part 1/mergesort/Cargo.toml create mode 100644 Algorithms Specialization/Part 1/mergesort/src/main.rs diff --git a/.gitignore b/.gitignore index 4118b59..8f0b9a2 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,7 @@ _config.yml # pycache **__pycache__/ -**.venv/ \ No newline at end of file +**.venv/ + +# rust binary +**target/ \ No newline at end of file diff --git a/Algorithms Specialization/Part 1/mergesort/Cargo.lock b/Algorithms Specialization/Part 1/mergesort/Cargo.lock new file mode 100644 index 0000000..0df03cd --- /dev/null +++ b/Algorithms Specialization/Part 1/mergesort/Cargo.lock @@ -0,0 +1,16 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "mergesort" +version = "0.1.0" +dependencies = [ + "text_io", +] + +[[package]] +name = "text_io" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee74b5019b48991b09803402aaf9e65a053b3993fe9d9c475ab67a395358ba76" diff --git a/Algorithms Specialization/Part 1/mergesort/Cargo.toml b/Algorithms Specialization/Part 1/mergesort/Cargo.toml new file mode 100644 index 0000000..cb83ba5 --- /dev/null +++ b/Algorithms Specialization/Part 1/mergesort/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "mergesort" +version = "0.1.0" +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +text_io = "0.1.9" + +[profile.release] +# Small binary +opt-level = "s" +lto = true +codegen-units = 1 \ No newline at end of file diff --git a/Algorithms Specialization/Part 1/mergesort/src/main.rs b/Algorithms Specialization/Part 1/mergesort/src/main.rs new file mode 100644 index 0000000..264905a --- /dev/null +++ b/Algorithms Specialization/Part 1/mergesort/src/main.rs @@ -0,0 +1,77 @@ +use text_io::read; + +fn main() { + println!("Hello, world!"); + + let line: String = read!("{}\n"); + // Create input Vec by mapping the parse + let array: Vec = line + .split_whitespace() + .map(|s| s.parse::().unwrap()) + .collect(); + + println!("Unsorted: {:?}", array); + let sorted = mergesort(array); + println!("Sorted {:?}", sorted); +} + +#[test] +fn merge_test() { + assert_eq!( + mergesort(vec![1, 6, 2, 5, 4, 3, 8, 7, 9]), + vec![1, 2, 3, 4, 5, 6, 7, 8, 9] + ); +} + +#[inline] +pub fn mergesort(mut array: Vec) -> Vec { + // Base Case + if array.len() == 2 { + if array[0] < array[1] { + return array; + } else { + return vec![array[1], array[0]]; + } + } else if array.len() == 1 { + return array; + }; + + // Recursivly Sort + let split = array.len() / 2; + let left = mergesort(array[0..split].to_vec()); + let right = mergesort(array[split..].to_vec()); + + // Merge + let mut ri = 0; + let mut li = 0; + + for k in 0..array.len() { + // Out of Bound Checks + let left_oob = li > (left.len() - 1); + let right_oob = ri > (right.len() - 1); + if left_oob { + array[k] = right[ri]; + ri += 1; + continue; + } else if right_oob { + array[k] = left[li]; + li += 1; + continue; + } + if left_oob && right_oob { + break; + } + + // Compare + if left[li] < right[ri] { + array[k] = left[li]; + li += 1; + } else { + array[k] = right[ri]; + ri += 1; + } + } + + // Return Sorted + return array; +} -- 2.51.2