题目:有两个有序数组a,b,现需要将其合并成一个新的有序数组。
简单的思路就是先放到一个新的数组中,再排序。但是这样的没体现任何算法,这里考的不是快速排序等排序算法。关键应该是如何利用 有序 已知这个条件。可以这样想,假设两个源数组的长度不一样,那么假设其中短的数组用完了,即全部放入到新数组中去了,那么长数组中剩下的那一段就可以直接拿来放入到新数组中去了。
其中用到的思想是:
归并排序思想
具体代码实现如下:
/**
* 两个有序数组的合并排序
* (默认2个有序数组都是升序)
*/
private static void testSortTwoSortedArray() {
int[] a = {12, 32, 63, 84, 105};
int[] b = {12, 32, 53, 74, 95};
int length1 = a.length;
int length2 = b.length;
int newArrayLength = length1 + length2;
int[] result = new int[newArrayLength];
int i = 0, j = 0, k = 0; //i:用于标示a数组 j:用来标示b数组 k:用来标示传入的数组
while (i < length1 && j < length2) {
/* 元素不管重复与否,直接给合并到一起 */
//if (a[i] <= b[j]) {
// result[k++] = a[i++];
//} else {
// result[k++] = b[j++];
//}
/* 去重复元素,但是空间利用率还是浪费啦,看结果后面有默认的2个0显示 */
if (a[i] < b[j]) {
result[k++] = a[i++];
} else if (a[i] == b[j]) {
result[k++] = a[i];
//在某个位置上2个值相等的话,取哪个都一样,
// 然后这个相等的位置的2个值都可以不用比啦,都直接向后移动1,继续比较
j++;
i++;
} else {
result[k++] = b[j++];
}
}
/* 后面while循环是用来保证两个数组比较完之后剩下的一个数组里的元素能顺利传入结果数组 */
while (i < a.length) {
result[k++] = a[i++];
}
while (j < b.length) {
result[k++] = b[j++];
}
System.out.println(Arrays.toString(result));
}
测试结果如下图:1,是去重复的;2,是不去重复的。