Java 将两个有序数组合成为一个有序数组

时间:2024-03-08 08:43:30

基本思路

  1.如果其中一个数组的元素均大于另一个数组的元素,则可以直接组合,不用拆分。

   即:其中一个数组的第一个元素大于或者小于另一个数组的最后一个元素

  2.若不满足1中的情况,则表明数组需要拆分,拆分的方法如下:

   (1)拆分前,默认两个数组以及最终输出数组的索引均为0;

   (2)将 两个数组 对应索引下的元素进行比较,小的一方 放入最终数组中的当前索引下的位置,并使小的一方数组的索引+1;

   (3)检查是否有数组已经遍历完毕,若有(即该数组的元素已经完全分配到结果数组中),则将另一个数组的剩余元素依次放入最终数组中,直接输出即可。

      (4)最终数组的索引+1,并重复(2),直到两个数组均完成索引任务。

  

      上图为假定的2-3步操作,A,B为要合并的数组,C为最终 输出数组,Index为该次填充后的下次索引变换情况。


源代码

public  int[] sortAndconnectArr(int FirstArr[], int SecondArr[]){
        int[] ResultArr=new int[FirstArr.length+SecondArr.length];
        //若两个Arr中其中一个Arr的都比另一个大,则能直接合成
        if(FirstArr[FirstArr.length-1]<SecondArr[0]){
            ResultArr=connectArr(FirstArr,SecondArr);
            return ResultArr;
        }
        if(SecondArr[SecondArr.length-1]<FirstArr[0]){
            ResultArr=connectArr(SecondArr,FirstArr);
            return ResultArr;
        }
        //取FirstArr的第一个元素与SecondArr的第一个元素比较
        //小的一方,放入ResultArr,并使其索引+1,继续比较,直到最后
        int IndexOfFArr=0;
        int IndexOfSArr=0;
        int IndexOfRArr=0;
        while (IndexOfFArr<=FirstArr.length-1||IndexOfSArr<=SecondArr.length-1){
            if(FirstArr[IndexOfFArr]<SecondArr[IndexOfSArr]){
                ResultArr[IndexOfRArr]=FirstArr[IndexOfFArr];
                IndexOfFArr++;
            }else {
                ResultArr[IndexOfRArr]=SecondArr[IndexOfSArr];
                IndexOfSArr++;
            }

            //其中一方的数组已经全部遍历,将余下的数组部分写入ResultArr
            //全部遍历完毕则因为IndexOfXX++的原因应该是正好等于Arr.Length
            if(IndexOfFArr>FirstArr.length-1){
                ResultArr=addArr(ResultArr,IndexOfRArr+1,SecondArr,IndexOfSArr);
                return ResultArr;
            }
            if(IndexOfSArr>SecondArr.length-1){
                ResultArr=addArr(ResultArr,IndexOfRArr+1,FirstArr,IndexOfFArr);
                return ResultArr;
            }
            IndexOfRArr++;
        }
        return ResultArr;
    }
    public  int[] connectArr(int FirstArr[], int SecondArr[]){
        int[] ResultArr=new int[FirstArr.length+SecondArr.length];
        System.arraycopy(FirstArr, 0, ResultArr, 0, FirstArr.length);
        System.arraycopy(SecondArr, 0, ResultArr, FirstArr.length, SecondArr.length);
        return ResultArr;
    }

    public  int[] addArr(int ResultArr[],int RArrIndex,int AddArr[],int AArrIndex){
        while(AArrIndex<=AddArr.length-1){
            ResultArr[RArrIndex]=AddArr[AArrIndex];
            AArrIndex++;
            RArrIndex++;
        }
        return ResultArr;
    }

 

验证函数

public static void main(String[] args) {
        int a[]={1,2,4,55,66,113,157,182,192,201};
        int b[]={40,45,66,70,120,140,160,200,1655,1732};
        int c[]=sortAndconnectArr(a,b);
        for(int i=0;i<c.length-1;i++){
            System.out.print(c[i]+"  ");
        }
    }

结果预览

1  2  4  40  45  55  66  66  70  113  120  140  157  160  182  192  200  1655  1732  
Process finished with exit code 0