C++11 合并排序对象时,不确定出现了什么问题

C++11 合并排序对象时,不确定出现了什么问题,c++11,object,mergesort,C++11,Object,Mergesort,关于这个问题: 我一直在尝试对包含3个整数的对象数组应用mergesort,在定义谁比谁大方面,我肯定它是正确的 我的问题是,我认为它在递归位不能很好地工作 这是一个家庭作业,我们没有被要求使用mergesort,但我几天前读到过这方面的内容,我正在尝试学习新的东西,我已经成功地将它应用于一个只有int的常规数组,但这里出现了一些问题: 1 R数组接收垃圾值。 2 leftCount和rightCount的值小于它们应该的值,尽管这可能是因为mergesort作为递归的一部分是这样工作的 我可以

关于这个问题:

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

我的问题是,我认为它在递归位不能很好地工作

这是一个家庭作业,我们没有被要求使用mergesort,但我几天前读到过这方面的内容,我正在尝试学习新的东西,我已经成功地将它应用于一个只有int的常规数组,但这里出现了一些问题:

1 R数组接收垃圾值。 2 leftCount和rightCount的值小于它们应该的值,尽管这可能是因为mergesort作为递归的一部分是这样工作的

我可以回去用一些简单的东西,但我真的很想把它做好,并将感谢您的帮助

因此,数字是一个日期,isBefore函数检查哪一个先到。我检查过了,效果很好。如果你愿意,我可以添加

尺寸=30; MyDate包含:整数天、月、年。 日历包含:MyDate数组[大小]

//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++];
}

您分配了不必要的空间:

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];

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

你永远不会在这里找到家庭作业标签。对问题进行重新分级你想问什么很不清楚。好吧,我记得这是我读过的某篇文章中的一个要求……我的问题是代码有什么问题,为什么会收到垃圾值?感谢您的更正!虽然,第二个可能修复了一些问题,但现在它收到了更多的垃圾值,还有什么可以建议的吗?我不确定,它对我使用ints很好。我忍者在我发布代码后就编辑了代码,所以你可能错过了我对我原始答案的更正,我将日期[I]改为日期[mid+I]?好吧,它开始工作了!是的,我错过了。非常感谢你,我已经想了好几个小时了!顺便问一下,有没有办法将所有空日期添加到数组的末尾?我的意思是0/0/0000,因此用户可以在输入列表中输入0/0/0000日期,您希望这些日期显示在输出的末尾吗?听起来你只需要修改isBefore函数。我想是的,我添加了isBefore函数的第一个条件,检查日期中是否有零,如果返回false,它只是将区域与零混合。取而代之,我为非嵌套的循环创建了2个,在开始合并排序之前对其进行排序。这不是最优的,但它可以工作。如果你有什么建议,我很想听听!