c++ 数组 有序数组插入 归并排序思想

对于两个有序数组arr1和arr2,arr1的末尾有足够的空间可以容纳arr2。

把arr2的所有数组插入arr1中,使得插入后的数组仍然是个有序数组。

解决思路是从尾到头比较arr1和arr2中的数字的大小,然后将较大的数字插入到相应的位置。

具体代码参考如下:


#include <iostream>
using namespace std;
/*template<class T>     测试模板函数,可以忽略
int getArrayLen(T& arr)
{
    return (sizeof(arr)/sizeof(arr[0]));
}*/

void insertArray(int arr1[],int arr2[],int lastIndexOfArr1, int lastIndexOfArr2)   //传输两个数组以及数组的末尾元素的下标
{
    if(lastIndexOfArr1<0 || lastIndexOfArr2<0)
    {
        return;
    }
    int newIndex=lastIndexOfArr1+lastIndexOfArr2+1;     //两个数组合并到同一个数组之后的尾元素的下标
    int len=newIndex+1;
    while(newIndex>0)                     //循环比较,较大的数字向后插入
    {
        if(arr1[lastIndexOfArr1]>=arr2[lastIndexOfArr2])
        {
            arr1[newIndex--]=arr1[lastIndexOfArr1];
            if(lastIndexOfArr1!=0)
                lastIndexOfArr1--;
        }
        else
        {
            arr1[newIndex--]=arr2[lastIndexOfArr2];
            if(lastIndexOfArr2!=0)
                lastIndexOfArr2--;
        }
        if(newIndex==0)    //比较到最后,最小的数字,插入到数组的0下标位置
        {
            arr1[0]=arr1[0]<arr2[0]?arr1[0]:arr2[0];
        }
    }

    for(int i=0;i<len;i++)
        cout << arr1[i] << " ";
    cout << endl;
}

int main()
{
    int arr1[30]={2,7,9,10,13,18,23,26,30,33};
    int arr2[]={1,3,5,7,9,11,13,15,23,29,31};
    insertArray(arr1,arr2,9,10);
    //cout << getArrayLen(arr1) << endl;  测试template函数模板,可以忽略
    //cout << getArrayLen(arr2) << endl;
    return 0;
}

上述代码主要的思路是从尾向头进行比较,降低复杂度的同时,避免了多次复制同一个数字的情况。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值