2017-04-08 66 views
0

所以這個問題:Mergesorting對象,不知道哪裏出了問題

我一直在試圖包含3個整數對象的數組上應用歸併,在界定方面誰比其他我更大肯定它的正確性。

我的問題是(我認爲)它不適用於遞歸位。

所以這是一項家庭作業,我們沒有被要求使用mergesort,但是我前幾天已經閱讀過它,我正在嘗試學習新的東西,我已經成功地將它應用於常規數組只有整數,但這裏出了點問題:

1)「R」數組接收垃圾值。 2)leftCount和rightCount的值比它們應該小(儘管這可能是因爲mergesort如何作爲遞歸的一部分工作)。

我可以回去只使用一些簡單的東西,但我真的想要得到它,並會很感激幫助。

所以,這些數字是一個日期,而isBefore()函數會檢查哪一個是第一個。我檢查了它,它工作正常,我可以添加它,如果你想我。

SIZE = 30; MyDate包含:int日,月,年。日曆包含:MyDate數組[SIZE]。

//using mergeSort algorithm 
void Calendar::sortDates() 
{ 
    int n = SIZE; 
    MergeSort(_dates,n); 
    //still need to add 0 - s in the end 
} 

void Calendar::MergeSort(MyDate* _dates,int n) 
{ 
    int mid, i; 
    MyDate *L, *R; 

    if (n < 2) return;//base condition for recursion 

    mid = n/2; 
    L = new MyDate[mid * sizeof(MyDate)]; 
    R = new MyDate[(n - mid) * sizeof(MyDate)]; 


    for (i = 0; i < mid; i++) 
    { 
     L[i] = _dates[i]; //creating left sub_array 
    } 

    for (i = mid; i < n; i++) 
     R[i] = _dates[i]; //creating right sub_array 

    MergeSort(L, mid); 
    MergeSort(R, n - mid); 
    Merge(_dates, L, mid, R, n - mid); 
} 
void Calendar::Merge(MyDate * _dates, MyDate * L, int leftCount, MyDate * R, int rightCount) 
{ 
    int i = 0, j = 0, k = 0; 
    bool ok = false; 
    MyDate max = _dates[0]; 
    while (i < leftCount && j < rightCount) 
    { 
     ok = L[i].isBefore(R[j]); 
     if (!ok) 
     { 
      _dates[k++] = L[i++]; 
     } 

     else _dates[k++] = R[j++]; 
    } 
    while (i < leftCount) 
    _dates[k++] = L[i++]; 
    while (j < rightCount) 
    _dates[k++] = R[j++]; 
} 
+0

你永遠不會在這裏找到家庭作業標籤..並重新提出了它的問題,它很不清楚你想問什麼.. – Arvindsinc2

+0

好吧,我記得它是從我讀一些帖子的要求...我的問題是什麼是錯的代碼,爲什麼它接收垃圾值? – Royi

回答

1

您分配的空間不必要量:

L = new MyDate[mid * sizeof(MyDate)]; 
R = new MyDate[(n - mid) * sizeof(MyDate)]; 
// should be 
L = new MyDate[mid]; 
R = new MyDate[n - mid]; 

而右子陣是垃圾的原因可能是:

for (i = mid; i < n; i++) 
    R[i] = _dates[i]; 
// should be 
for (i = 0; i < n - mid; i++) 
    R[i] = _dates[mid+i]; 

可能有其他的問題,這些都是兩個我一眼就注意到了。

+0

感謝您的更正!雖然,第二個可能會修復其中的一些,但現在它會收到更多的垃圾值,您可以提出什麼建議? – Royi

+0

我不確定,它對我來說在整數上工作正常。我忍者在發佈後立即編輯了代碼,所以也許你錯過了我對原始答案的修正,我把'_dates [i]'改爲'_dates [mid + i]'? –

+0

好吧,它的工作!是的,我錯過了它。非常感謝你,我一直試圖弄清楚幾個小時!順便說一下,有沒有辦法可以將所有「空」日期添加到數組的末尾?我的意思是0/0/0000 – Royi

相關問題