合并一个对象,不知道出了什么问题

时间:2017-04-08 04:46:14

标签: c++11 object mergesort

所以问题是:

我一直在尝试对包含3个整数的对象数组应用mergesort,在定义谁比另一个更大的方面,我肯定它是正确的。

我的问题是(我认为)它在递归位中不能很好地工作。

所以这是一个家庭作业,我们没有被要求使用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++];
}

1 个答案:

答案 0 :(得分: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];

可能还有其他问题,这些是我一眼就注意到的两个问题。