实例13 合并两个数组中的元素

本文介绍了一种算法,用于合并两个非降序的整数数组,并去除重复元素,同时保持结果数组的有序性。该算法通过比较两个数组的元素,逐个选择较小的元素插入新数组,当遇到相等元素时,仅插入一次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定含有n个元素的两个有序(非降序)整型数组a和b,合并两个数组中的元素到整型数组c在,要求去除重复元素并保持c有序。

#include <stdio.h>
#include <stdlib.h>
// 合并两个含有nA、nB个元素的有序数组
void Merge(int *a, int *b, int *c, int nA, int nB, int& nCout)
{
    int i = 0 ; //数组a的下标
    int j = 0 ;	//数组b的下标
    int k = 0 ;	//数组c的下标
     
    while (i < nA && j < nB)
    {
        if (a[i] < b[j])// 如果a的元素小,则插入a中元素到c
        {
            c[k++] = a[i] ;
            ++i ;
            nCout++; //新数组下标加1
        }
        else if (a[i] == b[j])// 如果a和b元素相等,则插入二者皆可,这里插入a
        {
            c[k++] = a[i] ;
            ++i ;
            ++j ;
            nCout++;
        }
        else // a[i] > b[j] // 如果b中元素小,则插入b中元素到c
        {
            c[k++] = b[j] ;
            ++j ;
            nCout++;
        }
    }
     
    if (i == nA) // 若a遍历完毕,处理b中剩下的元素
    {
        for (int m = j; m < nB; ++m) 
        {
            c[k++] = b[m] ;
            nCout++;
        }
    }
    else//j == n, 若b遍历完毕,处理a中剩下的元素
    {
        for (int m = i; m < nA; ++m)
        {
            c[k++] = a[m] ;
            nCout++;
        }
    }
}

int main()
{
    int* a= (int *)malloc(sizeof(int)*6);
    int* b= (int *)malloc(sizeof(int)*3);
     
    a[0]=2;
    a[1]=3;
    a[2]=4;
    a[3]=6;
    a[4]=8;
    a[5]=9;
     
    b[0]=7;
    b[1]=9;
    b[2]=10;

    int nOut = 0;
     
    int* output = (int *)malloc(sizeof(int)*12); //output为最终合并的数组,动态申请
    Merge(a, b, output, 6, 3, nOut); //数组合并
     
    for (int i=0; i<nOut; i++)
    {
        printf("%d,",output[i]);
    }
     
    printf("\n");
    //释放之前申请的多个空间
    free(a);
    a=NULL;
    free(b);
    b=NULL;
     
    free(output);
    output=NULL;
     
    printf("\n");
    
    system("pause");
    return 0;
}

### JavaScript 中合并两个数组的方法 在 JavaScript 中,有多种方式可以用来合并两个数组。以下是常见的几种方法及其特点: #### 使用 `concat()` 方法 `concat()` 是 ES5 提供的一种简单有效的方式,用于连接两个或多个数组,并返回一个新的数组[^1]。此方法不会修改原数组的内容。 ```javascript let array1 = [1, 2, 3]; let array2 = [4, 5, 6]; let mergedArray = array1.concat(array2); console.log(mergedArray); // 输出: [1, 2, 3, 4, 5, 6] ``` 尽管这种方法易于理解和使用,但在处理大量数据时可能会造成较大的内存消耗,因为每次调用都会创建新的数组实例[^5]。 #### 使用扩展运算符 (`...`) 自 ES6 起引入的扩展运算符是一种更简洁的方式来合并数组。它通过解构语法将一个数组展开并插入到另一个数组中。 ```javascript let array1 = [1, 2, 3]; let array2 = [4, 5, 6]; let mergedArray = [...array1, ...array2]; console.log(mergedArray); // 输出: [1, 2, 3, 4, 5, 6] ``` 这种方式不仅语义清晰,而且性能优于 `concat()` 方法,在现代浏览器中有更好的优化效果[^3]。 #### 使用 `for` 循环手动合并 当需要频繁操作大容量数组时,可以通过传统的 `for` 循环来逐项追加元素至目标数组。这种做法虽然较为繁琐,但能显著减少额外空间开销。 ```javascript let array1 = [1, 2, 3]; let array2 = [4, 5, 6]; for (let i = 0; i < array2.length; i++) { array1.push(array2[i]); } console.log(array1); // 输出: [1, 2, 3, 4, 5, 6] ``` 上述代码片段展示了如何利用 `push()` 函数逐一添加第二个数组中的每一项到第一个数组上。 #### 合并带有对象属性的数组 对于包含复杂结构(如对象)的情况,则需采用其他策略以确保新生成的对象能够正确反映原始信息。下面的例子演示了如何基于键值映射组合来自不同列表的信息[^4]: ```javascript function getFun() { let namelist = [{ name: 'Alice' }, { name: 'Bob' }]; let agelist = [{ age: 25 }, { age: 30 }]; let itemlist = []; itemlist = namelist.map((item, index) => ({ ...item, ...agelist[index] })); console.log(itemlist); } getFun(); /* 输出: [ {name: "Alice", age: 25}, {name: "Bob", age: 30} ] */ ``` 以上介绍了四种主要技术手段去解决JavaScript环境下两组资料串连的需求。每种方案都有其适用场景以及局限性,请依据实际项目需求选取最适合的技术路径实施开发工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值