From 2a613ae619698212d4f77bf62281018d220bd182 Mon Sep 17 00:00:00 2001 From: tanna Date: Mon, 8 Jun 2026 13:42:44 +0530 Subject: [PATCH] feat: implement median function --- src/primary/median.rs | 37 +++++++++++++++++++++++++++++++++++++ src/primary/mod.rs | 2 ++ 2 files changed, 39 insertions(+) create mode 100644 src/primary/median.rs diff --git a/src/primary/median.rs b/src/primary/median.rs new file mode 100644 index 0000000..66687cc --- /dev/null +++ b/src/primary/median.rs @@ -0,0 +1,37 @@ +/// Returns the median (middle) value of a sequence of `f64` values +/// +/// Empty input returns `None`. +/// +/// # Example +/// ``` +/// use rustats::primary::median; +/// +/// let values = [4.0, 3.0, 1.0, 3.0]; +/// let med = median(&values); +/// assert_eq!(med, Some(3.0)); +/// ``` + +pub fn median(values: &[f64]) -> Option { + if values.is_empty() { + return None; + } + + let mut sorted = values.to_vec(); + let n = sorted.len(); + + sorted.sort_by(|a, b| { + a.partial_cmp(b) + .expect("Median cannot be computed for NaN values!") + }); + + let m; + if n % 2 == 0 { + let i1 = n / 2; + m = (sorted[i1 - 1] + sorted[i1]) / 2.0; + } else { + let i2 = (n + 1) / 2; + m = sorted[i2 - 1]; + } + + Some(m) +} diff --git a/src/primary/mod.rs b/src/primary/mod.rs index e301a63..ffe1e57 100644 --- a/src/primary/mod.rs +++ b/src/primary/mod.rs @@ -1,3 +1,5 @@ pub mod mean; +pub mod median; pub use mean::mean; +pub use median::median;