diff --git a/oracle/src/default_combine_data.rs b/oracle/src/default_combine_data.rs
index 4f096cfff89b79951b91c0f05d50d2f91c1849b2..d8c3f080ce732ef9348f8f4929ec52e8d0007856 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 4b3483df3e840c8a1e2450db2d481978e802eb9a..650d3982cfd64d1da4fd61d39512c8b82bef5b24 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]