实现合并排序算法的问题
Implementing merge sort algorithm issue
我正在实现一个合并排序算法,在合并算法中收到一个std::bad_alloc,使用cerr语句,我发现我的错误出现在合并算法的第一个循环中。然而,我不知道出了什么问题。
vector<int> VectorOps::mergeSort(vector<int> toSort)
{
if(toSort.size() <= 1)
{
return toSort;
}
vector<int> left;
vector<int> right;
int half = toSort.size()/2;
for(int i = 0; i < half; ++i)
{
left.push_back(toSort.at(i));
}
for(int i = half; i < toSort.size(); ++i)
{
right.push_back(toSort.at(i));
}
//merge algorithim
vector<int> toReturn;
while(left.size() > 0 || right.size() > 0)
{
cerr << "The numbers are "<< endl;
if(left.size() > 0 && right.size() > 0)
{
if(left.at(0) <= right.at(0))
{
toReturn.push_back(left.at(0));
}
else
{
toReturn.push_back(right.at(0));
}
}
else if(left.size() > 0)
{
toReturn.push_back(left.at(0));
}
else if(right.size() > 0)
{
toReturn.push_back(right.at(0));
}
}
return toReturn;
}
In:
while(left.size() > 0 || right.size() > 0)
left
和right
的大小永远不会改变(您不会移除head元素),因此toReturn
在没有绑定的情况下增长,并且您会耗尽内存。
正如@BenJackson在回答中已经提到的。。。
left
和right
的大小从未改变。你只是从向量中得到元素,而不是从中移除。因此,toReturn
的大小在没有绑定的情况下增长。
vector
没有任何去除头部元素的方法,但你可以像一样实现
left.erase(left.begin());
对于您的解决方案,要么从向量中移除head元素,要么只迭代向量并获取值。
vector<int> toReturn;
int l = 0; r = 0;
while (l < left.size() || r < right.size()) {
if (l < left.size() && r < right.size()) {
if (left.at(l) <= right.at(r)) {
toReturn.push_back(left.at(l++));
} else {
toReturn.push_back(right.at(r++));
}
} else if (l < left.size()) {
toReturn.push_back(left.at(l++));
} else if (r < right.size()) {
toReturn.push_back(right.at(r++));
}
}
通过擦除头元素合并实现。
while (left.size() > 0 || right.size() > 0) {
cerr << "The numbers are " << endl;
if (left.size() > 0 && right.size() > 0) {
if (left.at(0) <= right.at(0)) {
toReturn.push_back(left.at(0));
//erase head element from left
left.erase(left.begin());
} else {
toReturn.push_back(right.at(0));
//erase head element from right
right.erase(right.begin());
}
} else if (left.size() > 0) {
toReturn.push_back(left.at(0));
//erase head element from left
left.erase(left.begin());
} else if (right.size() > 0) {
toReturn.push_back(right.at(0));
//erase head element from right
right.erase(right.begin());
}
}
相关文章:
- 算法问题:查找从堆栈中弹出的所有序列
- 到连接组件算法的问题(递归)
- 读取最后一行代码算法 - c++ 时出现问题
- 需要为 C++ 中的以下问题设计递归算法
- 我的C++语言蛮力算法有问题
- Coursera DSA 算法工具箱第 4 周第 2 个问题 - 分区纪念品
- 排序算法问题(购买商店物品)(崩溃)
- C++ 分而治之的算法问题
- 我对 std::unique(算法)C++有问题
- 对于这个问题,是否有更好的数据结构和算法选择
- 迭代快速排序方法的分区算法问题
- 这种快速排序算法有什么问题?
- 不确定我的排序算法出了什么问题
- 我的算法在 1D 数组中渲染矩形有什么问题
- 带有 std::vector 和 std::queue 的 Prim's 算法,我的代码有什么问题?
- 我的记忆动态规划算法有什么问题?
- 运行Dijkstra算法的问题
- 关于合并两个列表的算法的一些问题
- 函数以相反的顺序输出输入问题,并改进算法以解释相等的数字
- 分类算法和对象指针的问题