From a206abbd3cd3e1914ef29349c4ad4128e9fbc0b0 Mon Sep 17 00:00:00 2001 From: Juan Camilo Date: Sat, 14 Oct 2017 15:15:13 -0500 Subject: [PATCH] Add shaker sort in Rust related to #991 --- code/sorting/shaker_sort/shaker_sort.rs | 69 +++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 code/sorting/shaker_sort/shaker_sort.rs diff --git a/code/sorting/shaker_sort/shaker_sort.rs b/code/sorting/shaker_sort/shaker_sort.rs new file mode 100644 index 0000000000..417eb6bd1b --- /dev/null +++ b/code/sorting/shaker_sort/shaker_sort.rs @@ -0,0 +1,69 @@ +/* Part of Cosmos by OpenGenus Foundation */ +/* Added by Ondama */ + +/** Read a line of input **/ +fn read () -> String { + let mut input = String::new(); + std::io::stdin().read_line(&mut input).expect("failed to read from stdin"); + input.trim().to_owned() +} + +/** Display a message and parse input **/ +fn prompt (prompt: &str) -> T { + println!("{}", prompt); + let num = read(); + match num.parse() { + Ok(i) => i, + Err(..) => { + eprintln!("'{}' is not valid, using default instead.", num); + T::default() + } + } +} + +/** Sort array **/ +fn shaker_sort (arr: &mut Vec) { + let size = arr.len(); + for i in 0..size/2 { + let mut swapped: bool = false; + let k = size - i - 1; + for j in i..k { + let p = j; + let q = p + 1; + if arr[p] < arr[q] { + arr.swap(p, q); + swapped = true; + } + } + for j in i..k { + let p = k - j; + let q = p - 1; + if arr[p] > arr[q] { + arr.swap(p, q); + swapped = true; + } + } + if !swapped { + break; + } + } +} + +/** Entry point **/ +fn main () { + // The size is a natural number + let size = prompt::(&"Enter size of array:"); + // Fill array + let mut arr = Vec::new(); + loop { + let item = prompt::(&"Next array element:"); + arr.push(item); + if arr.len() == size { + break; + } + } + // Sort array + shaker_sort::(&mut arr); + // Print sorted array + println!("{:?}", arr); +}