所以问题是:
我一直在尝试对包含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++];
}
答案 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];
可能还有其他问题,这些是我一眼就注意到的两个问题。