合并有序数组
来自于LeetCode,Merge Sorted Array 题目很简单,就是要把两个有序数组合并成一个,结果存在第一个数组A中(假定A的空间足够存储),要求实现的函数原型如下:
public void merge(int A[], int m, int B[], int n) {}
m是A中元素的个数,n是B中元素的个数,需要注意的是n是数组B元素的个数,也是数组B的长度,而m只是A中元素的个数,A的长度>=(m + n)
如果按照一般的思路,用两个整形数m和n,分别表示A的位置和B的位置,从A中位置0开始,比较A[m]和B[n],如果B[n]小于A[m],就把B[n]插入到A[m]的位置,但是这样会导致A[m]后边的所有元素向后移动,效率非常低。
实际上,我们可以采用从后向前的方式来填充A,因为最后A中的元素个数为m+n个,那么就可以从A中的k = m+n-1这个位置开始,比较A[i]和B[j],大的填充到A[k]。循环结束时,只需要将B中剩余的元素填充到A中,因为如果A还有剩余的话,剩余的元素就根本不需要移动位置了,下面是代码
public class Solution { public void merge(int A[], int m, int B[], int n) { int i = m - 1, j = n - 1, 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--]; } } }

浙公网安备 33010602011771号