如何让Rust代码计算出1-10向量的真实中位数5.5?
修复Rust中位数计算错误,得到正确结果5.5
你的代码计算1到10的向量中位数时得到6,正确结果应为5.5,问题出在奇偶长度的判断逻辑完全颠倒,且索引计算有误:
错误分析
- 奇偶判断逻辑反转:当向量长度为偶数(如10个元素)时,中位数是中间两个数的平均值;但原代码中偶数分支直接返回单个元素,反而在奇数分支去取两个数,逻辑完全搞反。
- 索引取值错误:偶数长度下,中间两个数的索引应为
len/2 - 1和len/2(比如长度10时,索引4和5对应元素5和6),原代码的索引计算不符合这个规则。
修正后的代码
fn vector_median(vector: &mut Vec<i32>) -> f64 { vector.sort(); let len = vector.len(); if len % 2 == 1 { // 奇数长度,直接返回中间元素 f64::from(vector[len / 2]) } else { // 偶数长度,取中间两个元素的平均值 let mid_left = vector[len / 2 - 1]; let mid_right = vector[len / 2]; (f64::from(mid_left) + f64::from(mid_right)) / 2.0 } } fn main() { let mut vector1 = vec![1, 5, 6, 3, 2, 7, 9, 8, 4, 10]; let median = vector_median(&mut vector1); println!("{:?}", vector1); println!("La media es {median}"); }
说明
- 先排序向量(这部分原代码是对的)
- 奇数长度时,直接取中间索引
len/2的元素转为f64 - 偶数长度时,取中间两个相邻元素(
len/2 -1和len/2),求和后除以2得到平均值
运行修正后的代码,输出的中位数就是正确的5.5。
内容的提问来源于stack exchange,提问作者Soy_Asher
相关产品推荐
相关产品推荐

