两个有序数组的合并问题

问题描述

编写函数,将两个有序 vector 数组合并成一个新的有序 vector数组,函数原型为:

vector<int>  merg(vector<int> list1,vector<int> list2);

问题分析

第一步
将问题分解为两类处理方式:
两个有序数组是否都是不空;
两个有序数组的自身排列方式是升序还是降序;

第二步
在函数内先默认两个数组都为升序排列(包括数组为空,数组所有元素都相同两种情况)

第三步
把每种情况分别进行处理返回处理后的数组即可
设定这样的处理方式:
两个数组都为升序或者降序时,返回升序或者降序合并后的数组;
两个数组排列方式不同时(即一个为升序,一个为降序),返回降序排列后的数组;
有一个数组为空时,按照不为空的数组排列方式返回;
两个数组都为空时,输出“至少有一个数组不空”提示语句,返回一个空数组;


源代码

注:这里有很多代码十分冗余,只是为了满足题设,读者可改进为更简洁的执行方式

vector<int> merg(vector<int> list1,vector<int> list2){
	//分别取得两个数组的长度
    int length1 = list1.size();
    int length2 = list2.size();
    vector<int> relist(length1 + length2);
    int i(0);
    int j(0);
    int k(0);
    //默认两个数组都是升序排列
    int flag(0);
    bool flag1(true);
    bool flag2(true);
	//判断两个数组的排列方式
    while(length1 && flag < length1-1){
        if(list1[flag] > list1[flag +1]){
            flag1 = false;
            break;
        }
        flag++;
    }
    flag = 0;
    while(length2 && flag < length2-1){
        if(list2[flag] > list2[flag +1]){
            flag2 = false;
            break;
        }
        flag++;
    }

    //两个数组都为升序排列,输出为升序排列数组
    if(flag1 && flag2){
        while(j < length1 && k < length2){
            if(list1[j] <= list2[k])
                relist[i++] = list1[j++];
            else
                relist[i++] = list2[k++];
    }

    if(length1 && length2){
            if(j < length1)
                while(j < length1)
                relist[i++] = list1[j++];
            else
                while(k < length2)
                relist[i++] = list2[k++];
    }
    else if(!length1 && length2)
        relist = list2;
    else if(!length2 && length1)
        relist = list1;
    else
        cout << "请至少输入一个不为空的数组!";
    }

    //两个数组都为降序排列,输出为降序排列数组
    else if(!flag1 && !flag2){
        while(j < length1 && k < length2){
            if(list1[j] >= list2[k])
                relist[i++] = list1[j++];
            else
                relist[i++] = list2[k++];
    }

    if(length1 && length2){
            if(j < length1)
                while(j < length1)
                relist[i++] = list1[j++];
            else
                while(k < length2)
                relist[i++] = list2[k++];
    }
    else if(!length1 && length2)
        relist = list2;
    else if(!length2 && length1)
        relist = list1;
    else
        cout << "请至少输入一个不为空的数组!";
    }

    //两个数组不都为升序或者降序
    else{
            //数组1为升序且第二个数组不为空时,输出为降序数组
        if(flag1){
            vector<int> temp(length2);
            for(int m = 0,n = length2 -1;m < length2;m++,n--){
                temp[m] = list2[n];
            }
            while(j < length1 && k < length2){
            if(list1[j] <= temp[k])
                relist[i++] = list1[j++];
            else
                relist[i++] = temp[k++];
    }

    if(length1 && length2){
            if(j < length1)
                while(j < length1)
                relist[i++] = list1[j++];
            else
                while(k < length2)
                relist[i++] = temp[k++];
    }
    //若两个数组其中一个为空,则按照不为空的那个数组排列顺序输出
    else if(!length1 && length2)
        relist = list2;
    else if(!length2 && length1)
        relist = list1;
    else
        cout << "请至少输入一个不为空的数组!";
        }
        //数组2为升序且第二个数组不为空
    else{
           vector<int> temp(length1);
            for(int m = 0,n = length1 -1;m < length1;m++,n--){
                temp[m] = list1[n];
            }
            while(j < length1 && k < length2){
            if(temp[j] <= list2[k])
                relist[i++] = temp[j++];
            else
                relist[i++] = list2[k++];
    }

    if(length1 && length2){
            if(j < length1)
                while(j < length1)
                relist[i++] = temp[j++];
            else
                while(k < length2)
                relist[i++] = list2[k++];
    }
    else if(!length1 && length2)
        relist = list2;
    else if(!length2 && length1)
        relist = list1;
    else
        cout << "请至少输入一个不为空的数组!";
        }
    }
    return relist;
}

测试样例
(这里测试数组在主函数给出方便测试,故没有显示输入)

两个数组均为空
test有一个数组为空
test
两个都为升序
test
两个都为降序
test
一个为升序一个为降序
test
更多相关内容请参见

我的博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值