给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。
示例:输入: A = [1,2,3,0,0,0], m = 3 B = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
初始化 A 和 B 的元素数量分别为 m 和 n。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sorted-merge-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法 1: 直接合并后排序
算法
最直观的方法是先将数组 B 放进数组 A 的尾部,然后直接对整个数组进行排序。
时间复杂度:O((m+n)\log(m+n))O((m+n)log(m+n))
排序序列长度为 m+nm+n,套用快速排序的时间复杂度即可,平均情况为 O((m+n)\log(m+n))O((m+n)log(m+n))。
空间复杂度:O(\log(m+n))O(log(m+n))
排序序列长度为 m+nm+n,套用快速排序的空间复杂度即可,平均情况为 O(\log(m+n))O(log(m+n))。
方法二 :新建序列 采用双指针 之后再重新赋给A数组
方法三:在二的基础上进行,只不过不用新建序列,直接在A上操作,并且要从后往前走
void merge(int* A, int ASize, int m, int* B, int BSize, int n){
int a = m-1;
int b = n-1;
int c = m+n-1;
while(b!= -1)
{
if(a>=0)
{
A[c--]= B[b]>A[a]?B[b--]:A[a--];
}
else
{
A[c--] = B[b--];
}
}
}
注意的是边界问题,如果B的元素在a的前面,那就要注意这时是不用比较的