Skip to content

Instantly share code, notes, and snippets.

@Wonderfall
Created May 8, 2021 02:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Wonderfall/60e9098c40184cc066fc4b6d40a590d9 to your computer and use it in GitHub Desktop.
Save Wonderfall/60e9098c40184cc066fc4b6d40a590d9 to your computer and use it in GitHub Desktop.
Rust median, mean and mode
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