java合并两个有序的数组
2023-03-23 本文已影响0人
Bfmall
需求:
有序数组arr1和arr2,将它们合并成有序数组newArr(递增数组)。
思路:
新建一个以两个集合长度之和为长度的新数组,从两数组最左边开始比起,把小的放入新集合,并用变量标记后一位置, 每次比较都是比较的最左边未比较过的元素(通过变量),循环比较,直至其中有一个集合遍历结束,将另一个集合剩余部分加入新集合中即可.
代码实现:
/**
* 合并两个有序数组,合并后的数组同样按照递增排序
*
* @param arr1
* @param arr2
*/
public int[] mergeTowArray(int[] arr1, int[] arr2) {
/**
* arr1 = {1,3,5};
* arr2 = {3,6,9};
*/
if (arr1 == null || arr1.length == 0) {
return arr2;
}
if (arr2 == null || arr2.length == 0) {
return arr1;
}
int num = arr1.length + arr2.length;
int[] newArr = new int[num];
int p1 = 0;//arr1的指针
int p2 = 0;//arr2的指针
int pTemp = 0;//newArr的指针
/**
* 第一次while循环之后结果newMergeArr=[1, 3, 3, 5, 0, 0]
* 将小的一组arr1数据添加到新数组了,但是大的一组arr2还未完全添加到新数组中
*/
while (p1 < arr1.length && p2 < arr2.length) {
if (arr1[p1] <= arr2[p2]) {
//如果arr1的元素小于等于arr2的元素,将arr1的元素放入newArr中,将arr1的p1指针+1
newArr[pTemp] = arr1[p1];
p1 ++;
} else {
//如果arr1的元素大于arr2的元素,将arr2的元素放入newArr中,将arr2的p2指针+1
newArr[pTemp] = arr2[p2];
p2 ++;
}
//每一轮比较之后,将pTemp指针 +1
pTemp ++;
}
//将剩余元素添加到newArr数组之后
while (p1 < arr1.length) {
newArr[pTemp] = arr2[p1];
pTemp ++;
p1 ++;
}
//将剩余元素添加到newArr数组之后
while (p2 < arr2.length) {
newArr[pTemp] = arr2[p2];
pTemp ++;
p2 ++;
}
return newArr;
}
测试代码:
int[] mergeArr1 = {1,3,5};
int[] mergeArr2 = {3,6,9};
int[] newMergeArr = mergeTowArray(mergeArr1, mergeArr2);
Log.i(TAG, "newMergeArr="+Arrays.toString(newMergeArr));
输出结果:
newMergeArr=[1, 3, 3, 5, 6, 9]