Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这个递归没有得到它的基本情况?_C++_Recursion_Mergesort - Fatal编程技术网

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:您可以通过单击分数下方的灰色复选标记接受其中一个答案