无法理解错误

Unable to understand error

本文关键字:错误      更新时间:2023-10-16

我已经编写了一个合并排序算法如下,但在编译它时我得到以下内容,其中指出表达式:矢量下标超出范围

我不明白为什么会出现这个错误,请指出错误,我根据我对合并排序算法的理解编写了这个算法

根据我的理解,我已经编写了一个递归函数(mergesort(,其中每次将有问题的数组分为左右两部分,即左右数组进一步细分,直到子数组中只有 1 个元素存在一旦到达此阶段,就会调用合并函数对分区数组进行排序并将其合并到原始数组中,从中数组已分区,递归在递归树中倒退了一步

这是源代码

#include<iostream>
#include<vector>
using namespace std;
class Soham
{
vector<int> v;
public:
Soham();
void merge(vector<int> &, vector<int> & ,vector<int> &);
void mergesort(vector<int> &);
};
Soham::Soham()
{
int no;
for (int i = 0; i < 5; i++)
{
cin >> no;
v.push_back(no);
}
mergesort(v);
cout << "result" << endl;
for (auto it = v.begin(); it != v.end(); it++)
cout << *it << " ";
}
void Soham::mergesort(vector<int> &v)
{
if (v.size() < 2)
return;
else
{
vector<int>left, right; 
if (v.size() % 2 == 0)//if input size is even
{
auto it = v.begin() + (v.size() / 2);
left.assign(v.begin(),it);
right.assign(it, v.end());
}
else// if input size is odd
{
auto it = v.begin() + (v.size() / 2);
left.assign(v.begin(),next(it));
right.assign(next(it), v.end());
}
mergesort(left);
mergesort(right);
merge(left, right,v);
}
}
void Soham::merge(vector<int> &temp_left, vector<int> &temp_right,vector<int> &temp_main)
{
int i = 0, j = 0, k = 0;
while (i<= temp_left.size() && j <= temp_right.size())
{
if (temp_left[i] <= temp_right[j])
{
temp_main[k] = temp_left[i];
i++;
k++;
}
else
{
temp_main[k]=temp_right[j];
j++;
k++;
}
}
while (i <= temp_left.size())
{
temp_main[k]=temp_left[i];
i++;
k++;
}
while (j <= temp_right.size())
{
temp_main[k]=temp_right[j];
j++;
k++;
}
}
int main()
{
Soham a;
system("pause");
return 0;
}

感谢您的帮助

while (i <= temp_left.size())

当您以索引大小((访问向量时,您将获得越界访问