给出一个整数数组 和有序的整数数组 B,请将数组 B合并到数组 A中,变成一个有序的升序数组
注意:
1.可以假设 A数组有足够的空间存放 B数组的元素, A和 B中初始的元素数目分别为 m和 n,A的数组空间大小为 m+n.2.不要返回合并的数组,返回是空的,将数组 的数据合并到A里面就好了
3.数组在[0,m-1]的范围也是有序的
示例:
输入:[4,5,6],[1,2,3]
返回值:[1,2,3,4,5,6]
说明:A数组为[4,5,6],B数组为[1,2,3],后台程序会预先将A扩容为[4,5,6,0,0,0],B还是为[1,2,3],m=3,n=3,传入到函数merge里面,然后请同学完成merge函数,将B的数据合并A里面,最后后台程序输出A数组
思路:不用新建数组,A数组能存放下两个数组的元素,要把B合并进A并排成一个升序的数组 ,我们直接比较两数组的值,然后把大的值从A的后面开始放入。
代码及详情如下:
/**
*
* @param A int整型一维数组
* @param ALen int A数组长度
* @param B int整型一维数组
* @param BLen int B数组长度
* @return void
*/
void merge(int* A, int ALen, int m, int* B, int BLen, int n) {
int i=m-1; //作A原有元素的下标,从A的最后一个元素开始
int j=n-1; //作B的下标,从B的最后一个元素开始
int k=m+n-1; //作合并时A的下标,从A的最后一个空间开始
while(i>=0&&j>=0){ //当有一个数组比较完了就退出循环
if(A[i]>B[j]){ //谁大就将谁从后面开始放进去
A[k--]=A[i--];
}
else
A[k--]=B[j--];
}
//上面的循环退出说明有一个数组已经存放完毕,如果是A数组完了,
//那么如果B还有剩的话应该直接放在最前面去,因为剩下的肯定都是小于A的;
//如果是B数组完了那么就不用在管了,因为我们要得就是把B合并进来。
while(j>=0){
A[k--]=B[j--];
}
}
或者将上面程序的第一个循环换成三目运算符来计算:
void merge(int* A, int ALen, int m, int* B, int BLen, int n) {
// write code here
int i=m-1;
int j=n-1;
int k=m+n-1;
while(i>=0&&j>=0){
A[k--]=A[i]>B[j]?A[i--]:B[j--];
}
while(j>=0){
A[k--]=B[j--];
}
}