【发布时间】:2025-12-11 02:00:01
【问题描述】:
大约两周前,在我的 C++ 简介课程中,我被分配了一个项目,该项目涉及使用向量和排序算法。我已经成功实现了所有必需的算法,并且可以通过打印来自中间步骤和最终排序的所有向量来验证它们是否有效。我遇到的唯一问题是让合并排序以以下格式打印其中间结果:
[14, 7, 3, 12, 9, 11, 6, 2]
[14, 7, 3, 12] [9, 11, 6, 2]
[14, 7] [3, 12] [9, 11] [6, 2]
[14] [7] [3] [12] [9] [11] [6] [2]
[7, 14] [3, 12] [9, 11] [2, 6]
[3, 7, 12, 14] [2, 6, 9, 11]
[2, 3, 6, 7, 9, 11, 12, 14]
其中第一行和最后一行是原始和排序的原始向量。
我已经尝试修改我的向量打印过程,该过程接受我的合并排序函数通过对从被调用方接收到的原始数组进行一半而创建的两个向量。它以一种非常奇怪的方式打印结果,您将在下面看到。我也放弃了制作一个可以容纳所有内容并为每一行迭代的二维数组的想法。询问我应该在哪里调用我的新的和改进的打印功能也很重要......?
以下是我打印归并排序向量的过程:
/*
Procedure: printMergeSort
Purpose: prints merge sort steps to the console
*/
void printMergeSort(vector <int> left, vector <int> right)
{
for (int i = 0; i < left.size(); ++i)
{
if (i == 0)
printf("[%d, ", left[i]);
else if (i < left.size() - 1)
printf("%d, ", left[i]);
else
printf("%d], ", left[i]);
}
for (int i = 0; i < right.size(); ++i)
{
if (i == 0)
printf("[%d, ", right[i]);
else if (i < right.size() - 1)
printf("%d, ", right[i]);
else
printf("%d] \n", right[i]);
}
}``
还有我的合并和归并排序代码:
/*
Procedure: merge
Purpose: Helper funcrion for mergeSort...
Sorts the subarrays and merges them
*/
void merge(vector<int>& leftVector, vector<int>& rightVector, vector<int>& vectortoMerge)
{
int lefttmostValue = leftVector.size();
int rightmostValue = rightVector.size();
int i = 0, j = 0, k = 0;
//printMergeSort(leftVector, rightVector);
while (j < lefttmostValue and k < rightmostValue)
{
if (leftVector[j] < rightVector[k])
{
vectortoMerge[i] = leftVector[j];
//printf("%d ", vectortoMerge[i]);
++j;
}
else
{
vectortoMerge[i] = rightVector[k];
//printf("%d ", vectortoMerge[i]);
++k;
}
++i;
}
while (j < lefttmostValue)
{
vectortoMerge[i] = leftVector[j];
//printf("%d ", vectortoMerge[i]);
++j; ++i;
}
while (k < rightmostValue)
{
vectortoMerge[i] = rightVector[k];
//printf("%d ", vectortoMerge[i]);
++k; ++i;
}
}
/*
procedure: mergeSort
Purpose: Main function for the merge sort algorithm....
Splits the vector into 2 and makes a call the merge() function
*/
void mergeSort(vector<int>& vectortoSort)
{
if (vectortoSort.size() <= 1) return;
int middleElement = vectortoSort.size() / 2;
vector<int> leftVector;
vector<int> rightVector;
for (int j = 0; j < middleElement; ++j)
leftVector.push_back(vectortoSort[j]);
for (int j = 0; j < (vectortoSort.size()) - middleElement; ++j)
rightVector.push_back(vectortoSort[middleElement + j]);
printMergeSort(leftVector, rightVector);
printf(", ");
mergeSort(leftVector);
mergeSort(rightVector);
merge(leftVector, rightVector, vectortoSort);
}
预期的输出如上所述,但输入这些值时,我得到以下信息:
[14, 7, 3, 12], [9, 11, 6, 2][14, 7], [3, 12][14, [7, [3, [12, [9, 11] , [6, 2][9, [11, [6, [2,
有没有更好的方法来解决这个问题?我真的很感激能伸出援手,因为我所有的同事和朋友都被这件事难住了!
谢谢!!!
【问题讨论】:
-
这到底是谁指派的?看起来很邪恶....
-
输出很奇怪,因为 printMergeSort 不能正确处理单元素数组。
-
我会考虑存储中间结果。也许是一个由递归级别索引的字符串数组,您可以根据级别附加到字符串(而不是打印)。打印只会在最后完成。
标签: c++ sorting vector merge mergesort