合并排序对象,不确定出了什么问题
Mergesorting an object, not sure what goes wrong
那么问题来了:
我一直在尝试对包含 3 个整数的对象数组应用合并排序,就定义谁比另一个更大而言,我确信它是正确的。
我的问题是(我认为)它在递归位中工作得不好。
所以这是一项家庭作业,我们没有被要求使用归并排序,但我几天前读到过它,我正在尝试学习新事物,我已经成功地定期应用它只有整数的数组,但这里出了点问题:
1) "R" 数组接收垃圾值。
2) leftCount 和 rightCount 的值小于它们应有的值(尽管这可能是因为合并排序作为递归的一部分就是这样工作的)。
我可以回到只使用一些简单的东西,但我真的很想把它做好,希望能得到帮助。
因此,数字是一个日期,isBefore() 函数检查哪个先出现。我检查了它,它工作正常,如果你需要我可以添加它。
大小 = 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++];
}
您分配了不必要的 space:
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];
可能还有其他问题,我一眼就注意到了这两个
那么问题来了:
我一直在尝试对包含 3 个整数的对象数组应用合并排序,就定义谁比另一个更大而言,我确信它是正确的。
我的问题是(我认为)它在递归位中工作得不好。
所以这是一项家庭作业,我们没有被要求使用归并排序,但我几天前读到过它,我正在尝试学习新事物,我已经成功地定期应用它只有整数的数组,但这里出了点问题:
1) "R" 数组接收垃圾值。 2) leftCount 和 rightCount 的值小于它们应有的值(尽管这可能是因为合并排序作为递归的一部分就是这样工作的)。
我可以回到只使用一些简单的东西,但我真的很想把它做好,希望能得到帮助。
因此,数字是一个日期,isBefore() 函数检查哪个先出现。我检查了它,它工作正常,如果你需要我可以添加它。
大小 = 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++];
}
您分配了不必要的 space:
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];
可能还有其他问题,我一眼就注意到了这两个