C++中排序vector求中位数:奇数长度为何要对size减1?
关于排序vector中位数计算中
(size-1)/2的疑问解答 首先明确:对于奇数长度的vector,vec[(size - 1) / 2]和vec[size / 2]在C++整数除法(向零截断)下结果确实完全一样。比如你说的size=7的情况,(7-1)/2=3,7/2=3,指向的都是索引3的元素,也就是0-6的中间位置。
那为什么要多此一举写(size-1)/2?核心原因是为了和偶数长度的中位数计算逻辑保持统一:
- 当vector长度为偶数时,比如size=6,中位数通常取中间两个元素的平均值。这时候
(size-1)/2会得到2(指向第3个元素,索引从0开始),size/2得到3(指向第4个元素)——这两个正好是中间的两个元素。 - 如果你的代码里想用一套逻辑覆盖奇偶两种情况,
(size-1)/2可以稳定获取“左中间”元素,size/2获取“右中间”元素:奇数时两者指向同一个元素(正中间),偶数时指向相邻的两个中间元素。这样后续计算中位数(不管是取中间值还是平均值)的逻辑可以更连贯,不需要额外分支判断奇偶。
另外,这种写法在一些其他场景下也更通用:比如在采用向下取整除法的语言或场景中,(size-1)/2依然能准确拿到中间偏左的索引,而不需要调整逻辑。
简单说,这不是必须的(奇数时两种写法结果一样),但却是一种更严谨、更易于扩展的写法,能让代码在处理奇偶长度时的逻辑保持一致。
内容的提问来源于stack exchange,提问作者McChicken
相关产品推荐
相关产品推荐

