这个合并排序代码出了什么问题
what is wrong with this merge sort code?
我正试图使用迭代器编写合并排序来自学c++,但由于某种原因,这段代码正在编译,但结果没有排序。有人能找出它的毛病吗?在我未经训练的眼睛看来,这似乎很好。
typedef vector<int> vec_int;
typedef vector<int>::iterator vec_int_iter;
void merge_sort(vec_int& vec, vec_int_iter low, vec_int_iter high){
if(low < high){
vec_int_iter med = low + (high-low)/2 ;
merge_sort(vec, low, med);
merge_sort(vec, med+1, high);
arrange(vec, low, med, high);
}
}
void arrange(vec_int& vec, vec_int_iter low, vec_int_iter med, vec_int_iter high){
vec_int_iter left = low, right = med+1;
vec_int temp;
temp.clear();
vec_int_iter it = temp.begin();
while(left <= med and right <= high)
temp.push_back( (*left < *right)? *left++ : *right++ );
while(left <= med)
temp.push_back( *left++ );
while(right <= high)
temp.push_back( *right++ );
vec = temp;
}
错误的代码是vec = temp
,它将在合并的某个步骤中用临时向量替换原始向量。因为,每次排列,温度都只是从原点向量的低到高
然后原点向量变为子向量。
你可以每次返回一个新的矢量,或者在中进行
示例代码,更改排列功能:
void arrange(vec_int& vec, vec_int_iter low, vec_int_iter med, vec_int_iter high){
vec_int_iter left = low, right = med+1;
vec_int temp;
temp.clear();
while(left <= med and right <= high)
temp.push_back( (*left < *right)? *left++ : *right++ );
while(left <= med)
temp.push_back( *left++ );
while(right <= high)
temp.push_back( *right++ );
vec_int_iter start = low;
for(vec_int_iter t = temp.begin(); t <temp.end(); t++){
*start++ = *t;
}
}
相关文章:
- 警告处理为错误这里有什么问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 当我尝试添加 2 个大字符串时,我无法弄清楚出了什么问题
- 违反const正确性:我应该现实地期待什么问题
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 我的逻辑反转字符串中的元音有什么问题?
- 需要以下代码的帮助,下面的代码有什么问题
- 常量公共成员有什么问题?
- 以下代码中的函数模板有什么问题?
- 这个返回元素位置的基于循环的函数有什么问题?
- creat_list2功能有什么问题?
- 格式说明符C++有什么问题
- 任何人都可以告诉我我的 C++ 代码出了什么问题?
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 我的堆栈和库存清单程序的结构有什么问题?
- 此工厂功能有什么问题?
- 以下 C++ 代码有什么问题?
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了