面试题
两个有序的整型数组arr1,arr2, 将arr2合并到arr1中,使arr1成为一个有序数组
解题思路
大体有三种思路:
1、合并之后再进行整体排序
2、通过双指针算法从前往后进行遍历两个数组,最后将剩余的数据复制到arr1
3、通过双指针算法从后往前进行遍历,无需将arr在初始数组暂存到额外的数组中,这是对方法2的改进。
示例代码
import java.util.Arrays;
/*
合并两个有序数组
*/
public class MergeOrderedArraysTest {
public static void main(String[] args) {
int[] arr1 = {1, 3, 5, 7, 9, 0, 0, 0, 0,0,0};
int length1 = 5;
int[] arr2 = {2, 4, 6, 8,12,16};
int length2 = 6;
// System.out.println(Arrays.toString(mergeBySort(arr1,length1,arr2,length2)));
// System.out.println(Arrays.toString(mergeByDoublePointers(arr1,length1,arr2,length2)));
System.out.println(Arrays.toString(mergeByDoublePointersFromEnd(arr1,length1,arr2,length2)));
}
/**
合并之后再进行全局排序
*/
public static int[] mergeBySort(int[] arr1,int length1, int[] arr2, int length2){
System.arraycopy(arr2,0, arr1, length1, length2);
Arrays.sort(arr1);
return arr1;
}
/*
双指针迭代: 比较两个数组,从前往后依次遍历
*/
public static int[] mergeByDoublePointers(int[] arr1,int length1, int[] arr2, int length2){
int[] tempArr1 = new int[length1];
System.arraycopy(arr1,0, tempArr1, 0, length1);
int index1=0, index2=0, index = 0;
while(index1< length1 && index2 < length2){
if(tempArr1[index1]>arr2[index2]){
arr1[index] = arr2[index2];
index2++;
}else{
arr1[index] = tempArr1[index1];
index1++;
}
index++;
}
if(index<length1+length2){
if(index1<length1){
System.arraycopy(tempArr1,index1, arr1, index1+index2, length1-index1);
}else if(index2<length2){
System.arraycopy(arr2,index2, arr1, index1+index2, length2-index2);
}
}
return arr1;
}
/**
* 双指针迭代改进,从后往前遍历,就不需要额外的存储空间
*/
public static int[] mergeByDoublePointersFromEnd(int[] arr1,int length1, int[] arr2, int length2){
int index1=length1-1, index2=length2-1, index = length1+length2-1;
while(index1>=0 && index2 >=0){
if(arr1[index1]>arr2[index2]){
arr1[index] = arr1[index1];
index1--;
index--;
}else{
arr1[index] = arr2[index2];
index2--;
index--;
}
}
if(index2>=0){
System.arraycopy(arr2,0, arr1, 0, index2+1);
}
return arr1;
}
}