C++ 为什么这个递归没有得到它的基本情况?
我正在尝试实现一个合并排序函数。这是我的密码:C++ 为什么这个递归没有得到它的基本情况?,c++,recursion,mergesort,C++,Recursion,Mergesort,我正在尝试实现一个合并排序函数。这是我的密码: void merge_sort(int a[], int l, int u) { int mid = (l + u) / 2; if (mid) { merge_sort(a, l, mid); merge_sort(a, mid + 1, u); merge(a, l, mid, u); } } 我检查了mid是否得到值0,但又得到了它的初始值并变成了一个无限循环。您应该检查的是 if (mid != l)
void
merge_sort(int a[], int l, int u)
{
int mid = (l + u) / 2;
if (mid) {
merge_sort(a, l, mid);
merge_sort(a, mid + 1, u);
merge(a, l, mid, u);
}
}
我检查了
mid
是否得到值0
,但又得到了它的初始值并变成了一个无限循环。您应该检查的是
if (mid != l) {
// ...
}
请参阅完整的合并排序实现
编辑这假设
u
不在要排序的元素范围内。如果是,您应该测试如果(l
您必须检查该范围是否至少有2个元素:
/*对从'l'到'u'的一系列元素进行包含排序*/
无效合并_排序(int a[],int l,int u){
if(l
如果上限u
不包括在范围内,则代码应更改为:
/*对从'l'包含到'u'排除的元素范围进行排序*/
无效合并_排序(int a[],int l,int u){
如果(u-l>=2){
int mid=l+(u-l)/2;
合并排序(a、l、mid);
合并排序(a、mid、u);
合并(a、l、mid、u);
}
}
OP似乎假设u
包含在范围内,因此正确的测试是if(l
,而不是if(mid!=l)
,这将无法对2个元素块进行排序。@chqrlie感谢您的反馈。如果u
不在要排序的范围内,则第二个递归调用merge\u sort(a,mid+1,u)代码>不正确,应该是合并\排序(a、mid、u)代码>@chqrlie这就是我最初在答案中添加示例实现的原因。请参阅。您的问题应始终包括示例数据以及预期与实际输出。@LYRICSAREAWESOME:您可以通过单击分数下方的灰色复选标记接受其中一个答案