天天看點

算法 - 合并兩個有序數組成一個有序數組

最近看到一個算法題目,覺得很有意義,就自己查資料,摸索着自己實作了代碼,特記錄一下。

題目:有兩個數組a[]和b[],将它們合并成數組c[],需要c[]也是有序數組。

有兩種實作思路:

1. 定義一個新數組,長度為兩個數組長度之和,将兩個數組都copy到新數組,然後排序。

2. 給兩個數組分别定義一個下标,最大長度是數組長度減一,按位循環比較兩個數組,較小元素的放入新數組,下标加一(注意,較大元素對應的下标不加一),直到某一個下标超過數組長度時退出循環,此時較短數組已經全部放入新數組,較長數組還有部分剩餘,最後将剩下的部分元素放入新數組,大功告成。

第一種方式應該是大多數人想到的,也比較容易實作,下面主要來實作第二種方式。

代碼如下:

public static int[] MergeList(int a[],int b[])
        {
            int result[];  
//                定義一個新數組,長度為兩個數組長度之和
                result = new int[a.length+b.length];
              //i:a數組下标    j:b數組下标  k:新數組下标
                int i=0,j=0,k=0;
//                按位循環比較兩個數組,較小元素的放入新數組,下标加一(注意,較大元素對應的下标不加一),直到某一個下标等于數組長度時退出循環
                while(i<a.length && j<b.length)
                    if(a[i] <= b[j]) {
                        result[k++] = a[i++];
                        print(result);
                        System.out.println();
                    }else{
                        result[k++] = b[j++];
                    }
                /* 後面連個while循環是用來保證兩個數組比較完之後剩下的一個數組裡的元素能順利傳入 *
                 * 此時較短數組已經全部放入新數組,較長數組還有部分剩餘,最後将剩下的部分元素放入新數組,大功告成*/
                while(i < a.length) 
                    result[k++] = a[i++];
                while(j < b.length)
                    result[k++] = b[j++];
                return result;
           }