如何将两个排序的数组合并到一个排序的数组中,但不使用第三个数组

时间:2012-06-22 08:48:34

标签: java

给定两个按升序排序的数组,其中一个数组保存额外的空间以容纳两个数组的所有元素,合并两个已排序的数组,以便生成的数组也按升序排序,而不创建第三个数组。 / p>

我几乎写了一个合并程序,但我使用了第三个数组。

4 个答案:

答案 0 :(得分:0)

如果您没有效率问题,只需将一个数组添加到其他数组的末尾即可。然后对这个连接数组进行排序。

答案 1 :(得分:0)

public static int[] merge(int[] a, int[] b) {    
    int a_size = a.size();
    for(int i=0; i<b.size();i++ ) {
        a[a_size]= b[i];
        a_size++;
    } 
    Arrays.sort(a);
}

答案 2 :(得分:0)

一种方法如下:

  1. 从较小的数组中取出第一个元素,并在较大的数组中找到它的位置(比如它的第n个位置)。

  2. 现在从较小的数组中取出第二个元素,并在较大的数组中找到它的位置,而不是从头开始,而不是从第n个位置开始。

  3. 现在从较小的数组中获取第三个元素并重复此过程,直到较小的数组耗尽。

  4. 复杂性比较

    1.最佳案例复杂度与较小阵列的大小一样低。虽然最坏的情况是较小阵列的尺寸*较大阵列的尺寸。

    2.如果你使用Collection API中的实用程序排序方法,即Collection.sort()或Arrays.sort(),它们的复杂性在每种情况下都是 O(nlogn),其中n =每个数组大小的总和。因为这些方法使用合并排序

答案 3 :(得分:0)

尝试使用3个指针,假设i,j和k。 “ i”将指向第一个数组的最后一个元素,“ j”将指向第二个数组的最后一个元素,“ k”将指向第一个数组的最后一个空白。 比较i和j的元素,取较大者取k。然后递减k和i或j(以较大者为准)。继续此操作,直到i或j小于0。如果i在j之前小于0,则从头开始将第二个数组的其余元素添加到第一个数组中。

void mergeSortedArrays(int arr1[],int arr2[],int m,int n)
{
    int i,j,k;
    i=m-1;
    j=n-1;
    k=m+n-1;
    while(i>=0&&j>=0)
    {
        if(arr1[i]>arr2[j])
        arr1[k]=arr1[i--];
        else
        arr1[k]=arr2[j--];
        k--;
    }
    while(j>=0)
    arr1[k--]=arr2[j--];
}