给定两个按升序排序的数组,其中一个数组保存额外的空间以容纳两个数组的所有元素,合并两个已排序的数组,以便生成的数组也按升序排序,而不创建第三个数组。 / p>
我几乎写了一个合并程序,但我使用了第三个数组。
答案 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)
一种方法如下:
从较小的数组中取出第一个元素,并在较大的数组中找到它的位置(比如它的第n个位置)。
现在从较小的数组中取出第二个元素,并在较大的数组中找到它的位置,而不是从头开始,而不是从第n个位置开始。
现在从较小的数组中获取第三个元素并重复此过程,直到较小的数组耗尽。
复杂性比较
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--];
}