合并有序数组

来自于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--];
        }
    }
}

 

posted @ 2015-04-13 23:31  Truezion  阅读(155)  评论(0)    收藏  举报