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

C语言中降序数组合并保留较大元素的实现问题求助

解决两个降序数组合并取前5大元素的问题

嘿,我来帮你搞定这个数组的问题!你的需求是把两个降序数组里的元素挑出前5大的,存回数组a,最终得到{50, 40, 38, 25, 25}。先看看你原代码里的几个问题:

  • 内层循环里你修改了循环变量j(while里的j--),这直接打乱了for(j=0;j<5;j++)的遍历逻辑,导致插入位置完全错误。
  • 插入元素的逻辑有问题,没有正确找到b[i]应该插入的位置,移动元素的操作也不对。
  • 数组a的长度是固定的5,直接往里面插入元素会导致越界或者覆盖掉不该丢的元素。

正确的解法:双指针合并法

因为两个数组都是降序排列的,我们可以用双指针的方式高效合并,只取前5个最大的元素,步骤如下:

  1. 用一个临时数组存储合并后的结果(避免直接修改原数组导致的越界问题)。
  2. 两个指针分别遍历a和b,每次选较大的元素放入临时数组。
  3. 当其中一个数组遍历完后,把另一个数组的剩余元素继续放入临时数组,直到凑够5个元素。
  4. 最后把临时数组的内容复制回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:29:03