虚拟排序val数组并存储顺序的C语言代码异常排查求助
问题原因与修正方案
你的代码核心问题是order数组的赋值逻辑搞反了映射关系,导致存储的顺序和预期完全相反。
错误逻辑分析
你原本希望fractions.order[i]存储的是降序排序后第i位对应的原val数组索引,但当前代码:
for (int i = 0; i < NUM_J_DIRS; i++) { fractions.order[iv[i].index] = i; }
这段代码的作用是:把原val数组中索引为iv[i].index的元素,它在排序后的位置i,存入order数组的对应原索引位置。简单说,这是原索引→排序位置的映射,而你需要的是排序位置→原索引的映射。
修正代码
把order数组的赋值循环改成下面这样:
// set order for (int i = 0; i < NUM_J_DIRS; i++) { fractions.order[i] = iv[i].index; }
这样fractions.order[i]就直接存储了降序排序后第i位对应的原val数组索引,完全符合你的需求。
修正后输出
运行修正后的代码,会得到符合预期的输出(值相同的元素顺序可互换):
order = 0, dir: 1, the value was: 1.000000 order = 1, dir: 2, the value was: 1.000000 order = 2, dir: 3, the value was: 0.500000 order = 3, dir: 0, the value was: 0.100000
补充说明
排序部分的逻辑是正确的,已经完成了iv数组的降序排序,问题仅出在最后将排序结果映射到order数组的步骤。修正后order数组的每个元素就代表了对应排序位置的原数据索引,和你期望的虚拟排序逻辑完全匹配。
内容的提问来源于stack exchange,提问作者Woju
相关产品推荐
相关产品推荐

