From 38e4d68f4bf3f68db245c3a9c421b128f2846cdb Mon Sep 17 00:00:00 2001 From: specCon18 Date: Sat, 25 May 2024 19:44:48 -0400 Subject: [PATCH] added impl for radix sort need to debug --- src/data_structures/stack.rs | 12 ++++++++- src/main.rs | 9 +++++++ src/radix_sort.rs | 47 ++++++++++++++++++++++++++++++++++-- 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/data_structures/stack.rs b/src/data_structures/stack.rs index e8aca18..f2f8bec 100644 --- a/src/data_structures/stack.rs +++ b/src/data_structures/stack.rs @@ -1,8 +1,9 @@ +#[derive(Debug)] pub struct Stack { stack: Vec, } -impl Stack { +impl Stack { pub fn new() -> Self { Stack { stack: Vec::new() } } @@ -22,3 +23,12 @@ impl Stack { self.stack.last() } } + +impl IntoIterator for Stack { + type Item = T; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.stack.into_iter() + } +} diff --git a/src/main.rs b/src/main.rs index 41df508..5ea792e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -71,6 +71,14 @@ fn merge_sort_demo(){ println!("Array before merge sort: {:?}",arr); println!("Array after merge sort: {:?}",merge_sort::merge_sort(arr)); } +fn radix_sort_demo(){ + println!("-------------------"); + println!("RADIX SORT DEMO:"); + println!("-------------------"); + let arr = &[9, 3, 7, 4, 69, 420, 42]; + println!("Array before radix sort: {:?}",arr); + println!("Array after radix sort: {:?}",radix_sort::radix_sort(arr)); +} fn main() { println!(""); println!("|~~~~~~~~~~~~~~~|"); @@ -87,4 +95,5 @@ fn main() { quick_sort_demo(); bubble_sort_demo(); merge_sort_demo(); + radix_sort_demo(); } diff --git a/src/radix_sort.rs b/src/radix_sort.rs index fc47a71..e0a2466 100644 --- a/src/radix_sort.rs +++ b/src/radix_sort.rs @@ -1,3 +1,46 @@ -pub fn radix_sort(){ - +use crate::data_structures::stack::Stack; +pub fn radix_sort(arr: &[u64]) -> Vec { + let mut buckets: [Stack; 10] = [ + Stack::new(), + Stack::new(), + Stack::new(), + Stack::new(), + Stack::new(), + Stack::new(), + Stack::new(), + Stack::new(), + Stack::new(), + Stack::new(), + ]; + let mut sort_vec = arr.to_vec(); + let largest_place_value = get_largest_place(arr); + + for counter in 0..largest_place_value { + for num in &sort_vec { + let digit = get_digit(*num, counter as usize); + buckets[digit].push(*num); + } + + let mut index = 0; + for stack in &mut buckets { + while let Some(value) = stack.pop() { + sort_vec[index] = value; + index += 1; + } + } + } + + sort_vec +} + +fn get_digit(num: u64, place: usize) -> usize { + (num / 10u64.pow(place as u32)) as usize % 10 +} + + +fn get_largest_place(arr: &[u64]) -> usize { + arr.iter() + .map(|&num| (num as f64).log(10.0).ceil() as usize) + .max() + .unwrap_or(0) }