2012-07-09 60 views
-1
void merge(int *a1, int *a2, int *a3, int s1, int s2, int s3){ 
    s2 -=1; 
    int track =0; 
    s3-=1; 
    int p2=0; 
    int p3=0; 
    while(p2<s2 && p3 <s3){ 
     if(a2[p2]<a3[p3]) 
      a1[track++]=a2[p2++]; 
     else 
      a1[track++]=a3[p3++]; 
    } 
    while(p2<s2) a1[track++]=a2[p2++]; 
    while(p3<s3) a1[track++]=a3[p3++]; 
} 


void msort(int *array, int n){ 
    if(n<=1) return; 
    int a1_size = n/2; 
    int a2_size = n-n/2; 
    int a1[n/2]; 
    int a2[n-n/2]; 
    for(int i=0;i<n/2;i++){ 
    a1[i] = array[i]; 
    } 
    for(int i=0,j=n/2;j<n;i++,j++){ 
     a2[i] = array[j]; 
    } 
    msort(a1, n/2); 
    msort(a2, n-n/2); 
    merge(array, a1, a2, n, a1_size, a2_size); 
} 

int main(){ 
    int a[]={1,2,1,2,3,94,5,67}; 
    msort(a,8); 
    for(int i=0;i<8;i++) 
     cout << a[i] << endl; 
} 

這是我的代碼,我期望它會返回一個排序的數組。 我知道問題是關於傳遞數組的地址來合併將ammend數組內的數據,從而影響結果。我嘗試了很長時間,但仍然不知如何推薦它。有人可以給我一個提示或幫助嗎?合併排序代碼與陣列,卡在合併,只需要一點修正

+2

你已經使用了迭代器調試範圍C風格的數組,而不是? – 2012-07-09 07:00:29

回答

2

問題出在s2 -= 1s3 -= 1聲明中。你爲什麼這樣做?迭代從零開始的數組index的標準慣用法是計數,而index < length,而不是index < length-1

一對夫婦的其他注意事項:

  • 您分配了大量的附加內存(N *日誌(n)的整數),其中未使用的停留的大部分時間。只需要在merge內部進行分配,那麼最多可以隨時分配n整數。
  • 學會使用std::vector和/或
+0

噢,你是對的omg我怎麼會錯過 – 2012-07-09 07:09:55