劍指OFFER(java)-合併兩個已排序的數組

題目:有兩個排序的數組A1和A2,內存在A1的末尾有足夠多的空餘空間容納A2。請實現一個函數,把A2中的全部數字插入到A1中而且全部的數字是排序的。java

java無法像C那樣這麼定義ios

int A[100] = { 1, 3, 5, 7, 8, 12 };

並且int數組無法本身擴容。。。。。數組

so,只能另外定義一個數組,若是用C的話函數

package cglib;測試


public class List1  
{  
    public static void merge2SortedArray(int[] a , int[] b , int[] c){  
        //a數組的當前索引  
        int i = 0;  
        //b數組的當前索引  
        int j = 0;  
        //c數組的當前索引  
        int k = 0;  
        //循環,只要a和b都沒有遍歷完就一直循環  
        while(i < a.length && j < b.length){  
        //若是當前a[i]比b[j]小,就把c[k]元素置爲a[i],同時k++,i++  
        if(a[i] < b[j]){  
        c[k++] = a[i++];  
        //不然,若是當前a[i]比b[j]大,就把c[k]元素置爲b[j],同時k++,j++  
        }else{  
        c[k++] = b[j++];  
        }  
        }  
          
        //上個循環可以結束,說明a已經循環完或b已經循環完  
        //下述兩個循環只能有一個知足循環條件  
        //只要a沒有循環完,就把a中剩下的元素依次放入c中  
        while(i < a.length){  
        c[k++] = a[i++];  
        }  
        //只要b沒有循環完,就把b中剩下的元素依次放入c中  
        while(j < b.length){  
        c[k++] = b[j++];  
        }  
        }  
        //測試程序  
        public static void main(String[] args) {  
        //待合併數組a  
        int[] a = new int[]{1,3,5,7,9};  
        //待合併數組b  
        int[] b = new int[]{2,4,6,8};  
        //c用來存放合併以後的數組  
        int[] c = new int[a.length+b.length];  
        merge2SortedArray(a, b, c);  
        for(int i = 0;i < c.length;i++){  
        System.out.print(c[i]+"\t");  
        }  
        }
spa

 

輸出:排序

1    2    3    4    5    6    7    8    9   索引

 

用C++的話:內存

//思路1設置兩個索引indexofA1,indexofA2分別指向數組A1和A2的最後一個元素,即兩個數組的尾部;
//比較兩個索引指向的元素的大小:若indexofA1指向的元素(即A1[indexofA1])大於indexofA2指向的元素(即 A2[indexofA2]), 則將indexofA1指向的元素拷貝到臨時數組Temp中(Temp從後往前拷貝),  而後indexofA1向前 移動一個位置,而後再將indexA1指向的元素與indexofA2指向的元素進行比較;若indexofA1指向的元素小於indexofA2所指向 的元素,則將indexofA2指向的元素拷貝到臨時數組,indexofA2--,而後再將indexA2指向的元素與indexofA1指向的元素進 行比較;若indexofA1指向的元素和indexofA2指向的元素相等,則將這兩個元素都拷貝到數組Temp中,而後 indexofA1--,indexofA2--;以此類推,直到數組A1和A2的元素所有拷貝到數組Temp中, 最後將數組Temp中的所有元素依次複製數組A1中。這裏用到了輔助內存temp[]ci

代碼

  1.  
  2. //思路:設置兩個索引indexofA1,indexofA2分別指向數組A1和A2的最後一個元素,即兩個數組的尾部;  
  3. //比較兩個索引指向的元素的大小:若indexofA1指向的元素(即A1[indexofA1])大於indexofA2指向的元素(即A2[indexofA2]),  
  4. //                                 則將indexofA1指向的元素拷貝到臨時數組Temp中,而後indexofA1向前移動一個位置,而後再將indexA1指向的元素與indexofA1指向的元素進行比較  
  5. //  
  6. //                             若indexofA1指向的元素小於indexofA2所指向的元素,則將index  
  7. //  
  8. #include<iostream>  
  9. using namespace std;  
  10. #define A1length 4  
  11. #define A2length 5  
  12. void Array_Merge(int A1[],int n1,int A2[],int n2)//n1,n1分別爲數組A1和A2中實際元素的數目  
  13. {  
  14.     if(A1==NULL || A2==NULL || n1<=0 ||n2<=0)  
  15.     {  
  16.         cout<<"invalid parameter!"<<endl;  
  17.         return ;  
  18.     }  
  19.     int totallength=n1+n2-1;  
  20.     int indexofA1=n1-1;  
  21.     int indexofA2=n2-1;  
  22.     int *Temp=(int *)malloc(sizeof(int)*(n1+n2));  
  23.     if(Temp==NULL)  
  24.     {  
  25.         cout<<"insufficient memory!"<<endl;  
  26.         return;  
  27.     }  
  28.     while(indexofA1>=0 && indexofA2>=0 )//  
  29.     {  
  30.         if(A2[indexofA2]>A1[indexofA1])  
  31.         {  
  32.             Temp[totallength--]=A2[indexofA2];  
  33.             indexofA2--;  
  34.         }  
  35.         else if(A2[indexofA2]<A1[indexofA1])  
  36.         {  
  37.             Temp[totallength--]=A1[indexofA1];  
  38.             indexofA1--;  
  39.         }  
  40.         else  
  41.         {  
  42.             Temp[totallength--]=A1[indexofA1];  
  43.             Temp[totallength--]=A2[indexofA2];  
  44.             indexofA1--;  
  45.             indexofA2--;  
  46.         }  
  47.     }  
  48.     while(indexofA2>=0)//考慮A1的索引indexofA1先變爲-1,此時A1的元素已經所有拷貝到數組Temp中,  
  49.                        //此後只需將A2的剩餘元素依次拷貝到數組Temp中;  
  50.     {  
  51.         Temp[totallength--]=A2[indexofA2];  
  52.         indexofA2--;  
  53.     }  
  54.     //cout<<"indexofA2:"<<indexofA2+1<<endl;  
  55.     while(indexofA1>=0)//考慮A2的索引indexofA2先變爲-1,此時A2的元素已經所有拷貝到數組Temp中,  
  56.                        //此後只需將A1的剩餘元素依次拷貝到數組Temp中;  
  57.     {  
  58.         Temp[totallength--]=A1[indexofA1];  
  59.         indexofA1--;  
  60.     }  
  61.     //cout<<"indexofA1:"<<indexofA1+1<<endl;  
  62.     for(int i=0;i<=n1+n2-1;i++)  
  63.     {  
  64.         A1[i]=Temp[i];  
  65.     }  
  66. }  
  67. int main(void)  
  68. {  
  69.     int A1[10];  
  70.     int A2[5];  
  71.     int i;  
  72.     cout<<"input the array A1:"<<endl;  
  73.     for(i=0;i<A1length;i++)  
  74.         cin>>A1[i];  
  75.     cout<<"input the array A2:"<<endl;  
  76.     for(i=0;i<A2length;i++)  
  77.         cin>>A2[i];  
  78.     Array_Merge(A1,A1length, A2,A2length);  
  79.     for(i=0;i<A1length+A2length;i++)  
  80.     {  
  81.         cout<<A1[i]<<" ";  
  82.     }  
  83.     cout<<endl;  
  84.     return 0;  
  85. }  


 思路2:利用歸併排序中的歸併思想,開始時indexofA1和indexofA2兩個索引分別指向數組A1和A2的首元素,若 A1[indexofA1]<=A2[indexofA2]時,將indexofA1指向元素賦給輔助數組temp[],再將indexofA1向 後移動一個位置,若A1[indexofA1]>A2[indexofA2]時,將indexofA2指向元素賦給輔助數組temp[],再將 indexofA2向後移動一個位置,如此循環,因爲兩個數組大小可能不一樣,所以總會有一個數組會首先操做結束,即其索引指向該數組的尾部,此時只需將另 一個數組的元素所有依次賦給輔助數組便可,最後將輔助數組temp[]的元素從新賦值給數組A1[],就完成了全部操做。

代碼:

 

 

 

  1. #include<iostream>    
  2. #include<cstdlib>  
  3. #include<cassert>  
  4. using namespace std;   
  5.   
  6. void Array_Merge(int A1[],int n1,int A2[],int n2)//n1,n1分別爲數組A1和A2中實際元素的數目    
  7. {    
  8.     if(A1==NULL || A2==NULL || n1<=0 ||n2<=0)    
  9.     {    
  10.         cout<<"invalid parameter!"<<endl;    
  11.         return ;    
  12.     }    
  13.     int totallength=n1+n2-1;    
  14.     int indexofA1=0;    
  15.     int indexofA2=0;  
  16.     int indexoftemp=0;  
  17.     int A1end=n1-1;  
  18.     int A2end=n2-1;  
  19.     int *Temp=(int *)malloc(sizeof(int)*(n1+n2));    
  20.     if(Temp==NULL)    
  21.     {    
  22.         cout<<"insufficient memory!"<<endl;    
  23.         return;    
  24.     }    
  25.     while(indexofA1<=A1end && indexofA2<=A2end )//    
  26.     {    
  27.         if(A1[indexofA1]<=A2[indexofA2])    
  28.         {    
  29.             Temp[indexoftemp++]=A1[indexofA1++];    
  30.         }    
  31.         else  
  32.         {    
  33.             Temp[indexoftemp++]=A2[indexofA2++];      
  34.         }     
  35.     }    
  36.     while(indexofA1<=A1end)     
  37.     {    
  38.         Temp[indexoftemp++]=A1[indexofA1++];    
  39.     }      
  40.     while(indexofA2<=A2end)     
  41.     {    
  42.         Temp[indexoftemp++]=A2[indexofA2++];     
  43.     }     
  44.     for(int i=0;i<=totallength;i++)    
  45.     {    
  46.         A1[i]=Temp[i];    
  47.     }    
  48. }    
  49. int main(void)    
  50. {    
  51.     int A1length,A2length;   
  52.     int i;    
  53.     cout<<"input the num of array A1 and A2: "<<endl;  
  54.     cin>>A1length>>A2length;  
  55.     int *A1=(int *)malloc(sizeof(int)*(A1length+A2length));  
  56.     int *A2=(int *)malloc(sizeof(int)*A2length);  
  57.     cout<<"input the array A1:"<<endl;    
  58.     for(i=0;i<A1length;i++)    
  59.         cin>>A1[i];    
  60.     cout<<"input the array A2:"<<endl;    
  61.     for(i=0;i<A2length;i++)    
  62.         cin>>A2[i];    
  63.     Array_Merge(A1,A1length, A2,A2length);    
  64.     cout<<endl<<"after the merge ,array A1 is :"<<endl;  
  65.     for(i=0;i<A1length+A2length;i++)    
  66.     {    
  67.         cout<<A1[i]<<" ";    
  68.     }    
  69.     cout<<endl;    
  70.     return 0;    
  71. }  
相關文章
相關標籤/搜索