Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Interquartile Range #633

Merged
merged 33 commits into from
Dec 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
5939862
Add Octal to Decimal
cyrixninja Nov 10, 2023
486e672
Fixed Issues
cyrixninja Nov 10, 2023
6ab6ba5
Fixed Issues
cyrixninja Nov 10, 2023
c2b4530
Merge branch 'TheAlgorithms:master' into master
cyrixninja Nov 13, 2023
c2776b2
updating DIRECTORY.md
Nov 13, 2023
5850e8a
Add Euclidean Distance
cyrixninja Nov 13, 2023
0d073ad
Update DIRECTORY.md
cyrixninja Nov 13, 2023
bfd55bc
updating DIRECTORY.md
Nov 13, 2023
1b6c05c
Fixed Issues
cyrixninja Nov 13, 2023
a32eb47
Merge branch 'master' of https://github.com/cyrixninja/Rust
cyrixninja Nov 13, 2023
405ec65
Merge branch 'TheAlgorithms:master' into master
cyrixninja Nov 14, 2023
f41ab4f
Merge branch 'TheAlgorithms:master' into master
cyrixninja Nov 19, 2023
54120c9
Add Sylvester Sequence
cyrixninja Nov 19, 2023
5dbb82f
Fixed Issues
cyrixninja Nov 19, 2023
70c7f5f
Merge branch 'master' into master
siriak Nov 21, 2023
ba61b82
Merge branch 'TheAlgorithms:master' into master
cyrixninja Nov 22, 2023
c28f847
Merge branch 'TheAlgorithms:master' into master
cyrixninja Nov 23, 2023
83a95eb
Merge branch 'TheAlgorithms:master' into master
cyrixninja Nov 25, 2023
edcc045
updating DIRECTORY.md
Nov 25, 2023
f26f87f
Add Sum of Harmonic Series
cyrixninja Nov 25, 2023
f1df5b6
Merge branch 'master' of https://github.com/cyrixninja/Rust
cyrixninja Nov 25, 2023
0b39e8f
Fixed Issues
cyrixninja Nov 25, 2023
fa3cd6f
Merge branch 'TheAlgorithms:master' into master
cyrixninja Dec 2, 2023
a77250c
Add Lucas Series
cyrixninja Dec 2, 2023
945e177
updating DIRECTORY.md
Dec 2, 2023
35612f9
Add Lucas Series to mod.rs and DIRECTORY.md
cyrixninja Dec 2, 2023
5a124ea
Merge branch 'master' of https://github.com/cyrixninja/Rust
cyrixninja Dec 2, 2023
8ba3368
Update lucas_series.rs
cyrixninja Dec 2, 2023
22ea73d
Merge branch 'TheAlgorithms:master' into master
cyrixninja Dec 7, 2023
050e5ab
Merge branch 'TheAlgorithms:master' into master
cyrixninja Dec 11, 2023
6d052b6
Add Interquartile Range
cyrixninja Dec 11, 2023
eb40bfb
Update DIRECTORY.md
Dec 11, 2023
6bbcdf3
Add Interquartile Range
cyrixninja Dec 11, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions DIRECTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@
* [Huber Loss](https://github.com/TheAlgorithms/Rust/blob/master/src/math/huber_loss.rs)
* [Interest](https://github.com/TheAlgorithms/Rust/blob/master/src/math/interest.rs)
* [Interpolation](https://github.com/TheAlgorithms/Rust/blob/master/src/math/interpolation.rs)
* [Interquartile Range](https://github.com/TheAlgorithms/Rust/blob/master/src/math/interquartile_range.rs)
* [Karatsuba Multiplication](https://github.com/TheAlgorithms/Rust/blob/master/src/math/karatsuba_multiplication.rs)
* [Lcm Of N Numbers](https://github.com/TheAlgorithms/Rust/blob/master/src/math/lcm_of_n_numbers.rs)
* [Leaky Relu](https://github.com/TheAlgorithms/Rust/blob/master/src/math/leaky_relu.rs)
Expand Down
85 changes: 85 additions & 0 deletions src/math/interquartile_range.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
// Author : cyrixninja
// Interquartile Range : An implementation of interquartile range (IQR) which is a measure of statistical
// dispersion, which is the spread of the data.
// Wikipedia Reference : https://en.wikipedia.org/wiki/Interquartile_range

use std::cmp::Ordering;

pub fn find_median(numbers: &[f64]) -> f64 {
let mut numbers = numbers.to_vec();
numbers.sort_by(|a, b| a.partial_cmp(b).unwrap_or(Ordering::Equal));

let length = numbers.len();
let mid = length / 2;

if length % 2 == 0 {
(numbers[mid - 1] + numbers[mid]) / 2.0
} else {
numbers[mid]
}
}

pub fn interquartile_range(numbers: &[f64]) -> f64 {
if numbers.is_empty() {
panic!("Error: The list is empty. Please provide a non-empty list.");
}

let mut numbers = numbers.to_vec();
numbers.sort_by(|a, b| a.partial_cmp(b).unwrap_or(Ordering::Equal));

let length = numbers.len();
let mid = length / 2;
let (q1, q3) = if length % 2 == 0 {
let first_half = &numbers[0..mid];
let second_half = &numbers[mid..length];
(find_median(first_half), find_median(second_half))
} else {
let first_half = &numbers[0..mid];
let second_half = &numbers[mid + 1..length];
(find_median(first_half), find_median(second_half))
};

q3 - q1
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_find_median() {
let numbers1 = vec![1.0, 2.0, 2.0, 3.0, 4.0];
assert_eq!(find_median(&numbers1), 2.0);

let numbers2 = vec![1.0, 2.0, 2.0, 3.0, 4.0, 4.0];
assert_eq!(find_median(&numbers2), 2.5);

let numbers3 = vec![-1.0, 2.0, 0.0, 3.0, 4.0, -4.0];
assert_eq!(find_median(&numbers3), 1.0);

let numbers4 = vec![1.1, 2.2, 2.0, 3.3, 4.4, 4.0];
assert_eq!(find_median(&numbers4), 2.75);
}

#[test]
fn test_interquartile_range() {
let numbers1 = vec![4.0, 1.0, 2.0, 3.0, 2.0];
assert_eq!(interquartile_range(&numbers1), 2.0);

let numbers2 = vec![-2.0, -7.0, -10.0, 9.0, 8.0, 4.0, -67.0, 45.0];
assert_eq!(interquartile_range(&numbers2), 17.0);

let numbers3 = vec![-2.1, -7.1, -10.1, 9.1, 8.1, 4.1, -67.1, 45.1];
assert_eq!(interquartile_range(&numbers3), 17.2);

let numbers4 = vec![0.0, 0.0, 0.0, 0.0, 0.0];
assert_eq!(interquartile_range(&numbers4), 0.0);
}

#[test]
#[should_panic(expected = "Error: The list is empty. Please provide a non-empty list.")]
fn test_interquartile_range_empty_list() {
let numbers: Vec<f64> = vec![];
interquartile_range(&numbers);
}
}
2 changes: 2 additions & 0 deletions src/math/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ mod greatest_common_divisor;
mod huber_loss;
mod interest;
mod interpolation;
mod interquartile_range;
mod karatsuba_multiplication;
mod lcm_of_n_numbers;
mod leaky_relu;
Expand Down Expand Up @@ -112,6 +113,7 @@ pub use self::greatest_common_divisor::{
pub use self::huber_loss::huber_loss;
pub use self::interest::{compound_interest, simple_interest};
pub use self::interpolation::{lagrange_polynomial_interpolation, linear_interpolation};
pub use self::interquartile_range::interquartile_range;
pub use self::karatsuba_multiplication::multiply;
pub use self::lcm_of_n_numbers::lcm;
pub use self::leaky_relu::leaky_relu;
Expand Down