C语言中降序数组合并保留较大元素的实现问题求助
解决两个降序数组合并取前5大元素的问题
嘿,我来帮你搞定这个数组的问题!你的需求是把两个降序数组里的元素挑出前5大的,存回数组a,最终得到{50, 40, 38, 25, 25}。先看看你原代码里的几个问题:
- 内层循环里你修改了循环变量
j(while里的j--),这直接打乱了for(j=0;j<5;j++)的遍历逻辑,导致插入位置完全错误。 - 插入元素的逻辑有问题,没有正确找到
b[i]应该插入的位置,移动元素的操作也不对。 - 数组
a的长度是固定的5,直接往里面插入元素会导致越界或者覆盖掉不该丢的元素。
正确的解法:双指针合并法
因为两个数组都是降序排列的,我们可以用双指针的方式高效合并,只取前5个最大的元素,步骤如下:
- 用一个临时数组存储合并后的结果(避免直接修改原数组导致的越界问题)。
- 两个指针分别遍历
a和b,每次选较大的元素放入临时数组。 - 当其中一个数组遍历完后,把另一个数组的剩余元素继续放入临时数组,直到凑够5个元素。
- 最后把临时数组的内容复制回
a。
下面是修正后的代码:
#include<stdio.h> int main(){ int a[]={50, 40, 25, 8, 6}; int b[] = {38, 25, 2}; int temp[5]; // 临时数组存储最终结果 int i = 0, j = 0, k = 0; // 双指针合并,优先取较大的元素 while (k < 5 && i < 5 && j < 3) { if (a[i] >= b[j]) { temp[k++] = a[i++]; } else { temp[k++] = b[j++]; } } // 如果a还有剩余元素,继续取(确保凑够5个) while (k < 5 && i < 5) { temp[k++] = a[i++]; } // 如果b还有剩余元素,继续取 while (k < 5 && j < 3) { temp[k++] = b[j++]; } // 把结果复制回数组a for (i = 0; i < 5; i++) { a[i] = temp[i]; } // 输出最终结果 for(i=0;i<5; i++){ printf("[%d]", a[i]); } return 0; }
代码逻辑解释
i是数组a的遍历指针,j是数组b的遍历指针,k是临时数组temp的存储指针。- 第一个
while循环:每次比较a[i]和b[j],把较大的元素放入temp,并移动对应的指针,直到temp存满5个元素,或者其中一个数组遍历完。 - 后面两个
while循环:处理其中一个数组先遍历完的情况,把另一个数组的剩余元素继续放入temp,直到凑够5个元素。 - 最后把
temp的内容复制回a,就得到了你想要的结果。
运行这段代码,输出就是[50][40][38][25][25],完全符合你的需求。
内容的提问来源于stack exchange,提问作者Ricardo
相关产品推荐
相关产品推荐

