我正在尝试在c ++中实现一个简单的合并排序,但我一直在遇到这个错误:
我的代码:
void merge(vector<int> &data,int left,int mid,int right) {
vector<int> L, R, v;
int i, j;
for (i = 0; i < mid - left + 1; i++) {
L.push_back(v[left + i]);
}
for (j = 0; j < right - mid; j++) {
R.push_back(v[mid + j + 1]);
}
i = j = 0;
int k = left;
while (i < L.size() && j < R.size()) {
if (L[i] < R[j]) {
v[k++] = L[i++];
}
else {
v[k++] = R[j++];
}
}
while (i < L.size()) {
v[k++] = L[i++];
}
while (j < R.size()) {
v[k++] = R[j++];
}
vector<int>::const_iterator iter = v.begin();
for (; iter != v.end(); ++iter)
{
data[left++] = *iter;
}
}
void mergeSort(vector<int> &v, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(v, left, mid);
mergeSort(v, mid + 1, right);
merge(v, left, mid, right);
}
}
在main中调用:mergeSort(numbers,0,numbers.size());
其中number是带有一些数字的向量。
如何解决这个断言失败以及矢量下标超出范围意味着什么?
答案 0 :(得分:0)
编程规则是坏代码包含错误。:)
对于初学者,您应该使用std::vector<int>::size_type
类型而不是int
类型。
函数合并中存在拼写错误。很明显,在向量v
中必须使用向量data
,因为向量v
是空的。
void merge(vector<int> &data,int left,int mid,int right) {
vector<int> L, R, v;
int i, j;
for (i = 0; i < mid - left + 1; i++) {
L.push_back(v[left + i]);
}
for (j = 0; j < right - mid; j++) {
R.push_back(v[mid + j + 1]);
}
在循环之后,向量元素的数量比实际的元素数量大一个。
考虑以下使用函数merge
中的循环的测试程序。
#include <iostream>
#include <vector>
void merge( std::vector<int> &data,
std::vector<int>::size_type left,
std::vector<int>::size_type mid,
std::vector<int>::size_type right )
{
std::vector<int> L, R;
for ( std::vector<int>::size_type i = 0; i < mid - left + 1; i++ )
{
L.push_back( data[left + i] );
}
for ( std::vector<int>::size_type j = 0; j < right - mid; j++ )
{
R.push_back( data[mid + j + 1]);
}
std::cout << L.size() << '\t' << R.size() << std::endl;
}
void mergeSort( std::vector<int> &v,
std::vector<int>::size_type left,
std::vector<int>::size_type right )
{
if ( left < right )
{
auto mid = ( left + right ) / 2;
merge( v, left, mid, right );
}
}
int main()
{
std::vector<int> v( { 1, 2 } );
mergeSort( v, 0, v.size() );
return 0;
}
它的输出是
2 1
虽然原始向量v
仅包含2
元素。