2013-03-10 52 views
0

作爲一項任務,我必須實現mergesort。我正在傳遞數組作爲參數,導致分段錯誤。一切似乎都是正確的。我附上代碼。
arrint arr[1000],我將它傳遞給mergesort
mergesort(arr, 0, n);將數組作爲參數傳遞給c時的分段錯誤

剩下的代碼如下所示。

void merge(int a[], int l, int m, int r) 
{ 
    int temp[r -l]; 
    int templ = l; 
    int tempm = m; 
    register int k; 
    for(k=0; k<(r-l); k++) 
    { 
    if((tempm >= r)||(templ < m)&&(a[templ] <= a[tempm])) 
    { /*if number from left subarray is smaller*/ 
    temp[k] = a[templ]; 
    templ++; 
    } 
    else 
    { /*number from right subarray is smaller*/ 
    temp[k] = a[tempm]; 
    tempm++; 
    } 
    } 
    for(k= l; k< r; k++) 
    { /*copy results back to the array to be returned*/ 
    a[k] = temp[k - l]; 
    } 
} 

void mergesort(int ar[], int left, int right) 
{ 
    int mid;  
    if(left < right) 
    { 
    mid= (left + right)/2; 
    mergesort(&ar[0], left, mid - 1); 
    mergesort(&ar[0], mid, right); 
    merge(&ar[0], left, mid, right); 
    } 
} 
+0

無處不在,你使用'&AR [0]'你可以使用等效的,更簡單的'ar'代替。在這種情況下,使用數組名稱與傳遞元素「0」的地址相同。 – Blastfurnace 2013-03-10 22:30:21

回答

1

一旦你有了mergesortleft == 0right == 1,你將有一個無限循環:

void mergesort(int ar[], int left, int right) // IF LEFT IS 0 AND RIGHT IS 1 HERE... 
{ 
    int mid;  
    if(left < right) // ...THEN LEFT IS LESS THAN RIGHT AND... 
    { 
    mid= (left + right)/2; 
    mergesort(&ar[0], left, mid - 1); 
    mergesort(&ar[0], mid, right); // ...HERE WE HAVE A CALL THAT IS 
    // IDENTICAL TO THE ONE THAT GOT US HERE, INFINITE RECURSION 
+0

@wilsonmichaelpatrik:但我們正在減少權利和增加左邊,因爲我們正在計算每個電話中。所以有一次,左邊可能變得比右邊更大。所以它會停止遞歸。你能簡單地告訴我你是怎麼想的嗎? – 2013-03-10 22:02:20

+0

當你調用mergesort(&ar [0],0,1)時會發生什麼; – 2013-03-10 22:08:52

+0

假設我們在左邊合併爲0,右邊爲1,則left wilsonmichaelpatrick 2013-03-10 22:12:37