给定两个排序数组,任务是以排序方式合并它们。
例子:
输入: arr1[] = { 1, 3, 4, 5}, arr2[] = {2, 4, 6, 8} 输出: arr3[] = {1, 2, 3, 4, 4, 5, 6, 8}
输入: arr1[] = { 5, 8, 9}, arr2[] = {4, 7, 8} 输出: arr3[] = {4, 5, 7, 8, 8, 9}
方法1:暴力解法,将两个数组合成一个数组,在对其进行排序
时间复杂度 : O((m+n) log(m+n)),arr3 的整个大小为 m+n
辅助空间:O(1),不使用多余的空间
import java.util.Arrays;
public class _test {
public static void main(String[] args) {
int arr1[] = {1, 3, 5, 7};
int n1 = arr1.length;
int arr2[] = {2, 4, 6, 8};
int n2 = arr2.length;
//创建一个新数组存放前面两个数组(也可以对arr1后面直接追加arr2)
int arr3[] = new int[n1 + n2];
mergeArrays(arr1, arr2, n1, n2, arr3);
System.out.println("Array after merging");
for (int i=0; i < n1+n2; i++)
System.out.print(arr3[i] + " ");
}
public static void mergeArrays(int[] arr1, int[] arr2, int n1, int n2, int[] arr3){
int i = 0;
int j = 0;
int k = 0;
// 先把arr1加入arr3中
while(i < n1){
arr3[k++] = arr1[i++];
}
// 再把arr2加入arr3中
while(j < n2){
arr3[k++] = arr2[j++];
}
// 对新数组arr3进行排序
Arrays.sort(arr3);
}
}
方法2:
取两个排序数组 Ar(O(n1 + n2) 时间和 O(n1 + n2) 额外空间ray1 和 Array2 和一个空数组 3 。以三个指针 'i'、'j' 和 'k' 进行比较,这里的 'i' 指针指向 Array0 的第 1 个索引,类似地,“j” 和 'k' 指针指向 Array0 和 Array2 的第 3 个索引
初始数组
第 1 步: 选择较小的元素,即 4 并插入到 Array3 中,并在比较“i”和“j”后更新指针“j”和“k”。
选择较小的元素,即 4
第 2 步: 选择下一个较小的元素,即 5 并插入到 Array3 中,并在比较“i”和“j”后更新指针 'i' 和 'k'。
选择下一个较小的元素,即 5
第 3 步: 选择下一个较小的元素,即 7 并插入到 Array3 中,并在比较“i”和“j”后更新指针“j”和“k”。
选择下一个较小的元素,即 7
第 4 步:当“j”指针遇到 Array2 的长度时,首先是循环中断,其次是循环将所有元素从 arr1 复制到 arr3。
第二个 while 循环将所有元素从 arr1 复制到 arr3。
第 5 步: 从 Array1 中选取相邻元素并插入到 Array3 中并更新指针 i 和 k
从数组 1 中选取相邻元素并插入到数组 3 中
第 6 步: 从 Array1 中选取剩余元素并插入到 Array3 中,当 i 指针遇到 Array1 的长度时,这意味着 k = n1+n2,最后我们合并了排序的 Array3
从数组 1 中剩余元素并插入到 Array3 中,
public class _test {
public static void mergeArrays(int[] arr1, int[] arr2, int n1,
int n2, int[] arr3)
{
int i = 0, j = 0, k = 0;
// 在两个数组中都有元素的情况下
while (i<n1 && j <n2)
{
// 判断数组1和数组2中哪个元素下,小的元素插入到数组3中
if (arr1[i] < arr2[j])
arr3[k++] = arr1[i++];
else
arr3[k++] = arr2[j++];
}
// 当其中一个数组遍历完成之后,将剩余数组的元素插入到数组3中
while (i < n1)
arr3[k++] = arr1[i++];
while (j < n2)
arr3[k++] = arr2[j++];
}
public static void main (String[] args)
{
int[] arr1 = {1, 3, 5, 7};
int n1 = arr1.length;
int[] arr2 = {2, 4, 6, 8};
int n2 = arr2.length;
int[] arr3 = new int[n1+n2];
mergeArrays(arr1, arr2, n1, n2, arr3);
System.out.println("Array after merging");
for (int i=0; i < n1+n2; i++)
System.out.print(arr3[i] + " ");
}
}