算法面试题之合并两个有序数组

面试题

两个有序的整型数组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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值