如何实现这个算法呢?可以把各种情况都考虑进去,这样有利于分析问题,两个有序的数组排序是否一致,是否一样大,实现的时候把效率考虑进去。
- 两个数组排序一致吗?
- 两个数组一样吗?
是否都是升序或者降序,不能出现一个升序和一个降序。两个数组大小没有限制的,但是再算法实现时要考虑进去,具体讲算法。
有两个思路,
- 从一个数组复制到另外一个数组,再复制的过程中,把数据插入到相应的位置。需要扩容其中一个数组,不然放不下,空间复杂度O(数组的大小),时间复杂度为O(n^2),交换次数n*n。
- 申请一个临时数组,将两个数组按照顺序放在临时数组中,空间复杂度未O(两个数组长度之和),时间复杂度为O(n),无交换次数。
从理论上分析,肯定时采用第二种策略,毕竟为了获取更好的时间复杂度,不care这点空间,毕竟内存都这么大,哈哈哈。
- 为两个数组设置两个哨兵,排除放到临时数组之前,首先要比较两个哨兵的大小,为了更好的描述过程,我们把两个数组的哨兵叫做pa,pb。若是pa<pb,则讲pa放入临时数组中,然后pa往前走一步,pb不动。若是pa>pb,则pb往前走步一步,pa不动。
- 还有一个情况就是两个数组中肯定有个先走完的,所以在最后判断哪个未走完,未走完的需要讲它全部放在临时数组中,为啥因为数组都是有序的。
废话不多说,见下面代码:
private static int[] mergeList(int[] AList, int[] BList) {
int pivotA = 0;//数组AList 哨兵
int pivotB = 0;//数组BList 哨兵
int aLength = AList.length;//数组AList长度
int bLength = BList.length;//数组BList长度
int[] temp = new int[20];
int index = 0;
/**
* 对比哨兵的大小,来判断是否往前走。
*/
while (pivotA < aLength && pivotB < bLength) {
if (AList[pivotA] <= BList[pivotB]) {
temp[index++] = AList[pivotA];
pivotA++;
} else {
temp[index++] = BList[pivotB];
pivotB++;
}
}
/**
* 判断两个数组,哪个未走完,未走完的直接放在临时数组中。
*/
if (pivotA < aLength) {
for (int j = pivotA; j < aLength; j++) {
temp[index++] = AList[j];
}
}
if (pivotB < bLength) {
for (int j = pivotA; j < bLength; j++) {
temp[index++] = BList[j];
}
}
return temp;
}