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

虚拟排序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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:30:49