added impl for radix sort need to debug
This commit is contained in:
parent
54a58c9b04
commit
38e4d68f4b
3 changed files with 65 additions and 3 deletions
|
|
@ -1,8 +1,9 @@
|
||||||
|
#[derive(Debug)]
|
||||||
pub struct Stack<T> {
|
pub struct Stack<T> {
|
||||||
stack: Vec<T>,
|
stack: Vec<T>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Stack<T> {
|
impl<T: Copy> Stack<T> {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Stack { stack: Vec::new() }
|
Stack { stack: Vec::new() }
|
||||||
}
|
}
|
||||||
|
|
@ -22,3 +23,12 @@ impl<T> Stack<T> {
|
||||||
self.stack.last()
|
self.stack.last()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T: Copy> IntoIterator for Stack<T> {
|
||||||
|
type Item = T;
|
||||||
|
type IntoIter = std::vec::IntoIter<Self::Item>;
|
||||||
|
|
||||||
|
fn into_iter(self) -> Self::IntoIter {
|
||||||
|
self.stack.into_iter()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -71,6 +71,14 @@ fn merge_sort_demo(){
|
||||||
println!("Array before merge sort: {:?}",arr);
|
println!("Array before merge sort: {:?}",arr);
|
||||||
println!("Array after merge sort: {:?}",merge_sort::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() {
|
fn main() {
|
||||||
println!("");
|
println!("");
|
||||||
println!("|~~~~~~~~~~~~~~~|");
|
println!("|~~~~~~~~~~~~~~~|");
|
||||||
|
|
@ -87,4 +95,5 @@ fn main() {
|
||||||
quick_sort_demo();
|
quick_sort_demo();
|
||||||
bubble_sort_demo();
|
bubble_sort_demo();
|
||||||
merge_sort_demo();
|
merge_sort_demo();
|
||||||
|
radix_sort_demo();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,46 @@
|
||||||
pub fn radix_sort(){
|
use crate::data_structures::stack::Stack;
|
||||||
|
pub fn radix_sort(arr: &[u64]) -> Vec<u64> {
|
||||||
|
let mut buckets: [Stack<u64>; 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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue