Skip to content

Commit 1fd579c

Browse files
authored
Add Interquartile Range (#633)
1 parent f6ff829 commit 1fd579c

File tree

3 files changed

+88
-0
lines changed

3 files changed

+88
-0
lines changed

DIRECTORY.md

+1
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@
183183
* [Huber Loss](https://github.com/TheAlgorithms/Rust/blob/master/src/math/huber_loss.rs)
184184
* [Interest](https://github.com/TheAlgorithms/Rust/blob/master/src/math/interest.rs)
185185
* [Interpolation](https://github.com/TheAlgorithms/Rust/blob/master/src/math/interpolation.rs)
186+
* [Interquartile Range](https://github.com/TheAlgorithms/Rust/blob/master/src/math/interquartile_range.rs)
186187
* [Karatsuba Multiplication](https://github.com/TheAlgorithms/Rust/blob/master/src/math/karatsuba_multiplication.rs)
187188
* [Lcm Of N Numbers](https://github.com/TheAlgorithms/Rust/blob/master/src/math/lcm_of_n_numbers.rs)
188189
* [Leaky Relu](https://github.com/TheAlgorithms/Rust/blob/master/src/math/leaky_relu.rs)

src/math/interquartile_range.rs

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// Author : cyrixninja
2+
// Interquartile Range : An implementation of interquartile range (IQR) which is a measure of statistical
3+
// dispersion, which is the spread of the data.
4+
// Wikipedia Reference : https://en.wikipedia.org/wiki/Interquartile_range
5+
6+
use std::cmp::Ordering;
7+
8+
pub fn find_median(numbers: &[f64]) -> f64 {
9+
let mut numbers = numbers.to_vec();
10+
numbers.sort_by(|a, b| a.partial_cmp(b).unwrap_or(Ordering::Equal));
11+
12+
let length = numbers.len();
13+
let mid = length / 2;
14+
15+
if length % 2 == 0 {
16+
(numbers[mid - 1] + numbers[mid]) / 2.0
17+
} else {
18+
numbers[mid]
19+
}
20+
}
21+
22+
pub fn interquartile_range(numbers: &[f64]) -> f64 {
23+
if numbers.is_empty() {
24+
panic!("Error: The list is empty. Please provide a non-empty list.");
25+
}
26+
27+
let mut numbers = numbers.to_vec();
28+
numbers.sort_by(|a, b| a.partial_cmp(b).unwrap_or(Ordering::Equal));
29+
30+
let length = numbers.len();
31+
let mid = length / 2;
32+
let (q1, q3) = if length % 2 == 0 {
33+
let first_half = &numbers[0..mid];
34+
let second_half = &numbers[mid..length];
35+
(find_median(first_half), find_median(second_half))
36+
} else {
37+
let first_half = &numbers[0..mid];
38+
let second_half = &numbers[mid + 1..length];
39+
(find_median(first_half), find_median(second_half))
40+
};
41+
42+
q3 - q1
43+
}
44+
45+
#[cfg(test)]
46+
mod tests {
47+
use super::*;
48+
49+
#[test]
50+
fn test_find_median() {
51+
let numbers1 = vec![1.0, 2.0, 2.0, 3.0, 4.0];
52+
assert_eq!(find_median(&numbers1), 2.0);
53+
54+
let numbers2 = vec![1.0, 2.0, 2.0, 3.0, 4.0, 4.0];
55+
assert_eq!(find_median(&numbers2), 2.5);
56+
57+
let numbers3 = vec![-1.0, 2.0, 0.0, 3.0, 4.0, -4.0];
58+
assert_eq!(find_median(&numbers3), 1.0);
59+
60+
let numbers4 = vec![1.1, 2.2, 2.0, 3.3, 4.4, 4.0];
61+
assert_eq!(find_median(&numbers4), 2.75);
62+
}
63+
64+
#[test]
65+
fn test_interquartile_range() {
66+
let numbers1 = vec![4.0, 1.0, 2.0, 3.0, 2.0];
67+
assert_eq!(interquartile_range(&numbers1), 2.0);
68+
69+
let numbers2 = vec![-2.0, -7.0, -10.0, 9.0, 8.0, 4.0, -67.0, 45.0];
70+
assert_eq!(interquartile_range(&numbers2), 17.0);
71+
72+
let numbers3 = vec![-2.1, -7.1, -10.1, 9.1, 8.1, 4.1, -67.1, 45.1];
73+
assert_eq!(interquartile_range(&numbers3), 17.2);
74+
75+
let numbers4 = vec![0.0, 0.0, 0.0, 0.0, 0.0];
76+
assert_eq!(interquartile_range(&numbers4), 0.0);
77+
}
78+
79+
#[test]
80+
#[should_panic(expected = "Error: The list is empty. Please provide a non-empty list.")]
81+
fn test_interquartile_range_empty_list() {
82+
let numbers: Vec<f64> = vec![];
83+
interquartile_range(&numbers);
84+
}
85+
}

src/math/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ mod greatest_common_divisor;
3333
mod huber_loss;
3434
mod interest;
3535
mod interpolation;
36+
mod interquartile_range;
3637
mod karatsuba_multiplication;
3738
mod lcm_of_n_numbers;
3839
mod leaky_relu;
@@ -112,6 +113,7 @@ pub use self::greatest_common_divisor::{
112113
pub use self::huber_loss::huber_loss;
113114
pub use self::interest::{compound_interest, simple_interest};
114115
pub use self::interpolation::{lagrange_polynomial_interpolation, linear_interpolation};
116+
pub use self::interquartile_range::interquartile_range;
115117
pub use self::karatsuba_multiplication::multiply;
116118
pub use self::lcm_of_n_numbers::lcm;
117119
pub use self::leaky_relu::leaky_relu;

0 commit comments

Comments
 (0)