From 5f74630d0742b12a3bd363d1634b877ba61d773b Mon Sep 17 00:00:00 2001 From: Shaun Wang <spxwang@gmail.com> Date: Wed, 28 Apr 2021 17:27:20 +1200 Subject: [PATCH] Use 'select_nth_unstable' to get median. (#467) * Use 'select_nth_unstable' to get median. * fix * Update comments doc. --- oracle/src/default_combine_data.rs | 10 +++++----- traits/src/data_provider.rs | 7 +++---- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/oracle/src/default_combine_data.rs b/oracle/src/default_combine_data.rs index 4f096cf..d8c3f08 100644 --- a/oracle/src/default_combine_data.rs +++ b/oracle/src/default_combine_data.rs @@ -27,13 +27,13 @@ where let count = values.len() as u32; let minimum_count = MinimumCount::get(); - if count < minimum_count { + if count < minimum_count || count == 0 { return prev_value; } - values.sort_by(|a, b| a.value.cmp(&b.value)); - - let median_index = count / 2; - Some(values[median_index as usize].clone()) + let mid_index = count / 2; + // Won't panic as `values` ensured not empty. + let (_, value, _) = values.select_nth_unstable_by(mid_index as usize, |a, b| a.value.cmp(&b.value)); + Some(value.clone()) } } diff --git a/traits/src/data_provider.rs b/traits/src/data_provider.rs index 4b3483d..650d398 100644 --- a/traits/src/data_provider.rs +++ b/traits/src/data_provider.rs @@ -30,10 +30,9 @@ pub fn median<T: Ord + Clone>(mut items: Vec<T>) -> Option<T> { let mid_index = items.len() / 2; - items.sort(); - - // Won't panic as guarded items not empty case. - Some(items[mid_index as usize].clone()) + // Won't panic as `items` ensured not empty. + let (_, item, _) = items.select_nth_unstable(mid_index); + Some(item.clone()) } #[macro_export] -- GitLab