我正在尝试使用合并排序来对已转换为无符号长整数的IP地址列表进行排序。该向量包含18647个数字,如果这有所不同。我之前使用C#进行了合并排序,但这是我第一次在C ++中尝试它,所以我不知道是否有一些简单的我缺少。这是我目前的代码:
vector<unsigned long> Sorter::mergeSort( vector<unsigned long> v){
if( v.size() <= 1 ){
return v;
}
vector<unsigned long> left, right;
int mid = v.size() / 2;
for( int i = 0; i < mid; i++ ){
left.push_back( v[i] );
}
for( unsigned int j = mid; j <= v.size(); j++ ){
right.push_back( v[j] );
}
left = Sorter::mergeSort( left );
right = Sorter::mergeSort( right );
return Sorter::merge( left, right );
}
vector<unsigned long> Sorter::merge( vector<unsigned long> left, vector<unsigned long> right){
vector<unsigned long> result;
while( left.size() > 0 || right.size() > 0 ){
if( left.size() > 0 && right.size() > 0 ){
if( left[0] <= right[0] ){
result.push_back( left[0] );
left.erase( left.begin() );
}else{
result.push_back( right[0] );
right.erase( right.begin() );
}
}else if( left.size() > 0 ){
result.push_back( left[0] );
left.erase( left.begin() );
}else if( right.size() > 0 ){
result.push_back( right[0] );
right.erase( right.begin() );
}
}
return result;
}
答案 0 :(得分:2)
for( unsigned int j = mid; j <= v.size(); j++ )
^^
你应该使用j&lt; v.size()或j&lt; = v.size()-1(数组索引从0开始),否则,您的索引超出了绑定错误。
同时,最好通过引用传递矢量以节省一些费用。
另一点,因为你使用了vector,所以可以有18647个数字,因为向量头的内存空间是在Stack上分配的,但是vector的元素是在free store上分配的。 有关更多信息,请参阅此主题:
When vectors are allocated, do they use memory on the heap or the stack?