C语言矩阵元素直方图按数值升序排序问题求助
矩阵直方图排序后计数错位的解决方法
问题背景
我编写了一段C语言代码,用于统计n阶矩阵中每个数字的出现次数并生成直方图。运行后能正确统计元素和对应次数,但尝试按元素数值从低到高排序直方图时,仅对elements数组排序会导致元素与对应计数(histo数组)错位,出现元素和星号数量不匹配的问题。
原代码核心逻辑是:
- 从输入获取n阶矩阵
- 提取矩阵中所有不重复元素存入
elements数组 - 统计每个元素的出现次数存入
histo数组(histo[i]对应elements[i]的次数) - 输出直方图
尝试的错误排序代码仅交换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
相关产品推荐
相关产品推荐

