两个有序数组的合并问题

问题描述
编写函数,将两个有序数组合并成一个新的有序 数组,函数原型为:
vectormerg(vector list1,vector list2);
问题分析
第一步
将问题分解为两类处理方式:
两个有序数组是否都是不空;
两个有序数组的自身排列方式是升序还是降序;
第二步
在函数内先默认两个数组都为升序排列(包括数组为空,数组所有元素都相同两种情况)
第三步

两个有序数组的合并问题

文章插图
把每种情况分别进行处理返回处理后的数组即可
设定这样的处理方式:
两个数组都为升序或者降序时,返回升序或者降序合并后的数组;
两个数组排列方式不同时(即一个为升序,一个为降序),返回降序排列后的数组;
有一个数组为空时,按照不为空的数组排列方式返回;
两个数组都为空时,输出“至少有一个数组不空”提示语句,返回一个空数组;
源代码
注:这里有很多代码十分冗余,只是为了满足题设,读者可改进为更简洁的执行方式
vector merg(vector list1,vector list2){//分别取得两个数组的长度int length1 = list1.size();int length2 = list2.size();vector 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++];elserelist[i++] = list2[k++];}if(length1 && length2){if(j < length1)while(j < length1)relist[i++] = list1[j++];elsewhile(k < length2)relist[i++] = list2[k++];}else if(!length1 && length2)relist = list2;else if(!length2 && length1)relist = list1;elsecout << "请至少输入一个不为空的数组!";}//两个数组都为降序排列,输出为降序排列数组else if(!flag1 && !flag2){while(j < length1 && k < length2){if(list1[j] >= list2[k])relist[i++] = list1[j++];elserelist[i++] = list2[k++];}if(length1 && length2){if(j < length1)while(j < length1)relist[i++] = list1[j++];elsewhile(k < length2)relist[i++] = list2[k++];}else if(!length1 && length2)relist = list2;else if(!length2 && length1)relist = list1;elsecout << "请至少输入一个不为空的数组!";}//两个数组不都为升序或者降序else{//数组1为升序且第二个数组不为空时,输出为降序数组if(flag1){vector 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++];elserelist[i++] = temp[k++];}if(length1 && length2){if(j < length1)while(j < length1)relist[i++] = list1[j++];elsewhile(k < length2)relist[i++] = temp[k++];}//若两个数组其中一个为空,则按照不为空的那个数组排列顺序输出else if(!length1 && length2)relist = list2;else if(!length2 && length1)relist = list1;elsecout << "请至少输入一个不为空的数组!";}//数组2为升序且第二个数组不为空else{vector 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++];elserelist[i++] = list2[k++];}if(length1 && length2){if(j < length1)while(j < length1)relist[i++] = temp[j++];elsewhile(k < length2)relist[i++] = list2[k++];}else if(!length1 && length2)relist = list2;else if(!length2 && length1)relist = list1;elsecout << "请至少输入一个不为空的数组!";}}return relist;}