力扣
首先我们可以用java自带的排序算法来实现
import java.util.Arrays;
public class ArrayMerge {
public static void main(String[] args) {
int[] ns=new int[]{1,2,3,0,0,0};
int n=3;
int[] ms=new int[]{2,5,6};
int m=3;
// merge(nums,3,ms,3);
for (int i = 0; i < m; i++) {
ns[n+i]=ms[i];
}
Arrays.sort(ns);
for (int i = 0; i < ns.length; i++) {
System.out.println(ns[i]);
}
}
}
通过比较 两个数组同一位置的元素 如果元素小则放到新的数组当中,在比较 大的数组中的下一位直到比较完成指定数量
import java.util.Arrays;
public class ArrayMerge {
public static void main(String[] args) {
int[] ns=new int[]{1,2,3,0,0,0};
int n=3;
int[] ms=new int[]{2,5,6};
int m=3;
merge(ns,3,ms,3);
// for (int i = 0; i < m; i++) {
// ns[n+i]=ms[i];
// }
// Arrays.sort(ns);
// for (int i = 0; i < ns.length; i++) {
// System.out.println(ns[i]);
// }
}
public static void merge(int[]ns,int n,int[]ms,int m){
int k=m+n;
int[] temp=new int[k];
for (int i = 0,nIndex=0,mIndex=0; i < k; i++) {
System.out.println(nIndex+""+mIndex);
//当前m 索引是否超出m的有效个数 如果超过则放入ns
if(mIndex>=m){
temp[i]=ns[nIndex++];
}else if(nIndex>=n){
temp[i]=ms[mIndex++];
}//如果 ns ms 则放入 ms[mIndex]
else
{
temp[i]=ms[mIndex++];
}
}
for (int i = 0; i < temp.length; i++) {
ns[i]=temp[i];
}
for (int i = 0; i < temp.length; i++) {
System.out.println(temp[i]);
}
}
}
此时 时间复杂度 为 O(m+n)
方法二:
直接放到A数组中这样能少占用空间
public static void merge1(int[]ns,int n,int[]ms,int m){
int k=m+n;
for(int i=k-1,nIndex=n-1,mIndex=m-1;i>=0;i--){
if(nIndex<0){
ns[i]=ms[mIndex--];
}else if(mIndex<0){
break;
}else if(ns[nIndex]>ms[mIndex]){
ns[i]=ns[nIndex--];
}else{
ns[i]=ms[mIndex--];
}
}
for (int i = 0; i < ns.length; i++) {
System.out.println(ns[i]);
}
}
所有代码:
import java.util.Arrays;
public class ArrayMerge {
public static void main(String[] args) {
int[] ns=new int[]{1,2,3,0,0,0};
int n=3;
int[] ms=new int[]{2,5,6};
int m=3;
// System.out.println("----------------default---------------------");
// defaultMerge(ns,n,ms,m);
// System.out.println("----------------双指针方法1---------------------");
// merge(ns,3,ms,3);
System.out.println("----------------双指针方法2---------------------");
merge1(ns,n,ms,m);
}
public static void defaultMerge(int[]ns,int n,int[]ms,int m){
for (int i = 0; i < m; i++) {
ns[n+i]=ms[i];
}
Arrays.sort(ns);
for (int i = 0; i < ns.length; i++) {
System.out.println(ns[i]);
}
}
public static void merge(int[]ns,int n,int[]ms,int m){
int k=m+n;
int[] temp=new int[k];
for (int i = 0,nIndex=0,mIndex=0; i < k; i++) {
System.out.println(nIndex+""+mIndex);
//当前m 索引是否超出m的有效个数 如果超过则放入ns
if(mIndex>=m){
temp[i]=ns[nIndex++];
}else if(nIndex>=n){
temp[i]=ms[mIndex++];
}//如果 ns ms 则放入 ms[mIndex]
else
{
temp[i]=ms[mIndex++];
}
}
for (int i = 0; i < temp.length; i++) {
ns[i]=temp[i];
}
for (int i = 0; i < temp.length; i++) {
System.out.println(temp[i]);
}
}
public static void merge1(int[]ns,int n,int[]ms,int m){
int k=m+n;
for(int i=k-1,nIndex=n-1,mIndex=m-1;i>=0;i--){
if(nIndex<0){
ns[i]=ms[mIndex--];
}else if(mIndex<0){
break;
}else if(ns[nIndex]>ms[mIndex]){
ns[i]=ns[nIndex--];
}else{
ns[i]=ms[mIndex--];
}
}
for (int i = 0; i < ns.length; i++) {
System.out.println(ns[i]);
}
}
}