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

C语言矩阵元素直方图按数值升序排序问题求助

矩阵直方图排序后计数错位的解决方法

问题背景

我编写了一段C语言代码,用于统计n阶矩阵中每个数字的出现次数并生成直方图。运行后能正确统计元素和对应次数,但尝试按元素数值从低到高排序直方图时,仅对elements数组排序会导致元素与对应计数(histo数组)错位,出现元素和星号数量不匹配的问题。

原代码核心逻辑是:

  1. 从输入获取n阶矩阵
  2. 提取矩阵中所有不重复元素存入elements数组
  3. 统计每个元素的出现次数存入histo数组(histo[i]对应elements[i]的次数)
  4. 输出直方图

尝试的错误排序代码仅交换elements数组元素,未同步处理histo数组,导致错位。

问题原因

elements和histo是一一绑定的配对数组:elements[i]的出现次数就是histo[i]的值。单独排序elements会打破这种对应关系,使得排序后的elements[i]对应的是原来histo[j]的计数,自然错位。

解决方案

排序时,交换elements数组中元素的同时,必须同步交换histo数组对应位置的元素,保证配对关系始终成立。另外要注意排序的循环边界:elements的有效元素范围是0到size,所以循环应基于size而非原矩阵的n。

修改后的排序代码

在生成histo数组之后、输出直方图之前插入以下排序代码:

int a;
// 冒泡排序,同步交换elements和histo
for (i = 0; i <= size; ++i) 
{
    for (j = i + 1; j <= size; ++j)
    {
        if (elements[i] > elements[j]) 
        {
            // 交换elements中的元素
            a = elements[i];
            elements[i] = elements[j];
            elements[j] = a;
            // 同步交换histo中对应位置的计数
            a = histo[i];
            histo[i] = histo[j];
            histo[j] = a;
        }
    }
}

完整修改后关键代码片段

/*Affichage du tableau histo */
printf("\n Affichage du tableau histo \n");
for (i = 0; i <= size; i++)
    printf("%d ", histo[i]);

// 新增的排序代码,同步处理elements和histo
int a;
for (i = 0; i <= size; ++i) 
{
    for (j = i + 1; j <= size; ++j)
    {
        if (elements[i] > elements[j]) 
        {
            a = elements[i];
            elements[i] = elements[j];
            elements[j] = a;
            
            a = histo[i];
            histo[i] = histo[j];
            histo[j] = a;
        }
    }
}

/*Affichage de l'histogramme */
printf("\n");
printf("\n Affichage de l'histogramme \n");
for (i = 0; i <= size; i++) {
    printf("\n %d : ", elements[i]);
    for (j = 0; j < histo[i]; j++)
        printf("* ");
}

验证结果

修改后运行示例输入,输出的直方图会按元素数值升序排列,且计数匹配:

Affichage de l'histogramme

 2 : * * *
 3 : * * * * * * * *
 5 : * * * * *

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:50:21