You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基数排序(Radix Sort)桶大小不符单元测试要求的问题求助

基数排序(Base=7 降序)桶0大小不符问题排查方案

核心排查方向

先明确问题本质:最终排序结果正确,但单元测试中桶0的统计大小与预期不符,说明排序的最终结果逻辑没问题,但桶的计数/映射逻辑和测试用例的预期不匹配,重点排查以下几点:


1. 检查余数到桶索引的映射逻辑(最常见错误)

降序基数排序的核心是反转余数的桶映射:升序时余数r对应桶r,但降序时余数r应对应桶base-1 - r(比如base=7时,余数0对应桶6,余数6对应桶0)。如果你的代码直接沿用了升序的映射逻辑,桶0的统计值就会和测试预期的桶6值一致,导致报错。

错误示例(升序映射套用降序):

// 错误:降序时未反转余数
int remainder = num % base;
count[remainder]++;

正确的降序映射:

int remainder = num % base;
// 反转余数,将大余数映射到前序桶,小余数映射到后序桶
int bucketIdx = base - 1 - remainder;
count[bucketIdx]++;

2. 验证单元测试的预期合理性

确认测试用例的预期值是基于降序排序的桶分布,而非升序。比如测试用例数组[0,3,1,6](base=7):

  • 升序第一轮桶0大小是1(仅数字0)
  • 降序第一轮桶0大小是1(仅数字6,因为余数6被映射到桶0)
    如果测试预期是升序的桶0大小,那你的代码逻辑没问题,是测试用例的预期错了。

3. 边界值的余数处理

  • 数字0:0对base取余始终为0,降序下应映射到最后一个桶(base-1),如果错误放到桶0,会导致桶0大小超出预期。
  • 负数:不同语言中负数取余的结果不同(比如Java中-1%7=-1,Python中-1%7=6),如果数组包含负数,需先统一将所有数转为正数(加偏移量),处理完再还原,否则余数计算错误会导致桶计数混乱。
  • 位数不足的数:处理高位时,位数不足的数余数为0,降序下应映射到最后一个桶,而非桶0。

4. 手动复现定位问题

拿一个极小的测试用例手动计算桶分布,和代码输出对比:
比如数组[5,0,2,6],base=7,降序排序第一轮(个位):

  • 各数余数:5,0,2,6
  • 降序映射后的桶索引:1(7-1-5)、6(7-1-0)、4(7-1-2)、0(7-1-6)
  • 桶0的大小应为1(仅数字6)

如果代码输出的桶0大小不是1,直接定位到余数映射的代码段修改即可。

内容的提问来源于stack exchange,提问作者Sakops

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 01:02:35