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