一、问题描述
合并两个升序数组a,b到数组c中。
二、思路分析
1、第一种就是双重遍历,事件复杂度O(M*N)
2、第二种先合并两个数组然后使用快排,时间复杂度为O(n+nlogn)
3、第三种比较巧妙,主要讲一下第三种是如何做的
- 设置a数组末端索引为i,b数组末端索引为j,设置c数组为c[countIndex]
- 同时从后往前遍历数组元素
- 如果b[j]>a[i]则,count[countIndex] = b[j],j–
- 如果b[j]<=a[i]则,count[countIndex] = a[i],i–
- countIndex–
- 遍历完成后,判断i和j是否为-1,如果不为-1,则说明前面还有元素,将前面的元素插入到c数组的前面相应位置上即可
三、代码实现
#include<stdio.h>
void merge(int a[],int num1,int b[],int num2,int arr[]){
int totalNumber = num1 + num2 - 1;
int newArr[totalNumber+1];
int i,j;
for(i=num1-1,j=num2-1;i>=0&&j>=0;){
if(b[j] > a[i]){
newArr[totalNumber] = b[j];
j--;
}else{
newArr[totalNumber] = a[i];
i--;
}
totalNumber--;
}
if(i >= 0){
for(int p=0;p<=i;p++){
newArr[p] = a[p];
}
}else if(j >= 0){
for(int p=0;p<=j;p++){
newArr[p] = b[p];
}
}
for(int i=0;i<=10;i++){
c[i] = newArr[i];
}
}
int main(){
int a[5] = {2,3,4,5,7};
int b[6] = {1,5,6,8,9,10};
int c[11];
merge(a,5,b,6,c);
return 0;
}