Created
May 8, 2021 02:11
-
-
Save Wonderfall/60e9098c40184cc066fc4b6d40a590d9 to your computer and use it in GitHub Desktop.
Rust median, mean and mode
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use std::collections::HashMap; | |
fn main () { | |
let mut numbers = vec![12, 14, 8, 3, 5, 19, 23, 24, 28, 32, 48, 13, 13, 48]; | |
println!("median is {}", median(&mut numbers)); | |
println!("mean is {}", mean(&numbers)); | |
println!("mode is {}", mode(&numbers)); | |
} | |
fn median(numbers: &mut [i32]) -> f64 { | |
numbers.sort(); | |
let middle = numbers.len() / 2; | |
match numbers.len() % 2 { | |
0 => (numbers[middle] + numbers[middle - 1]) as f64 / 2.0, | |
_ => numbers[middle] as f64, | |
} | |
} | |
fn mean(numbers: &[i32]) -> f64 { | |
let sum: i32 = numbers.iter().sum(); | |
sum as f64 / numbers.len() as f64 | |
} | |
fn mode(numbers: &[i32]) -> i32 { | |
let mut occurrences = HashMap::with_capacity(numbers.len()); | |
for number in numbers { | |
let count = occurrences.entry(number).or_insert(0); | |
*count += 1; | |
} | |
let max_value = occurrences.values().map(|v| *v).max().unwrap(); | |
let mut modes = occurrences | |
.into_iter() | |
.filter_map(|(k, v)| if v == max_value { Some(*k) } else { None }) | |
.collect::<Vec<i32>>(); | |
// By convention, we return the mode with the smallest value | |
modes.sort(); | |
modes[0] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment