Java 將兩個有序數組合成為一個有序數組


基本思路

  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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM