合并排序的数组
题目描述:
给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。
初始化 A 和 B 的元素数量分别为 m 和 n。
示例:
输入:
A = [1,2,3,0,0,0], m = 3
B = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
题目分析:
这道题简单就简单在不需要考虑数组A空间的问题
建立两个AB数组两个指针
惯性思路一:
从小到大去比较AB两个数组,插入一个B就把A剩下的元素集体向后移动一个位置,一看就很复杂。、
思路二:
从大到小去比较,我们知道AB数组的长度,直接用长度去当指针就可以了,那最后一个元素该放的位置我们是知道的。比如例子中我们比较A最后的元素A[m-1]3和B最后的元素吧B[n-1]6,6比较大应该放在数组的最后的位置,就应该放在A现在的数组长度加B的数组长度的位置,即A[m+n-1],那数组B相当于插入进去一个了,可以将B的长度n减一,再去比较B的B[n-1]5和A[m-1]3,依旧是数组B中的元素比较大,这时候再把它插入A[m+n-1]中。
一看就形成了循环,所以以上操作一个循环就可以完成了。
题目代码:
class Solution {
public void merge(int[] A, int m, int[] B, int n) {
while(m>0&&n>0)
{
if(A[m-1]<=B[n-1])
{
A[m+n-1] = B[n-1];
--n;
}
else
{
A[m+n-1] = A[m-1];
--m;
}
}
if(m==0)//只剩下B了
{
while(n>0)
{
A[n-1] = B[n-1];
n--;
}
}
}
}