Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.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++_Mergesort - Fatal编程技术网

C++中的合并算法

C++中的合并算法,c++,mergesort,C++,Mergesort,我有以下代码 #include <iostream> using namespace std; void merge(int c[],int a[],int n,int b[],int m){ for (int i=0,j=0,k=0;k<n+m;k++){ if (i==n) { c[k]=b[j++]; continue;} if (j==m ){ c[k]=a[i++];continue;}

我有以下代码

#include <iostream>
using namespace std;
void merge(int c[],int a[],int n,int b[],int m){
         for (int i=0,j=0,k=0;k<n+m;k++){

             if (i==n) {  c[k]=b[j++]; continue;}
             if (j==m ){  c[k]=a[i++];continue;}

             c[k]=(a[i]<b[j])? a[i++]:b[j++];

         }



}
void mergesort(int a[],int b[],int l,int r){
if (l>r)  return ;
     int m=(l+r)/2;

     mergesort(b,a,l,m);
     mergesort(b,a,m+1,r);

 merge(a+l,b+l,m-l+1,b+m+1,r-m);

}
int main(){


    int a[]={12,4,2,5,3,6,7,8,10,11};
const   int n=sizeof(a)/sizeof(int);
int b[n];
mergesort(a,b,0,n-1);
    for (int i=0;i<n;i++){

        cout<<b[i]<< "  ";

    }




     return 0;
}
请帮我修一下


我已经更新了我的代码

mergesort需要检测是否有人要求它对长度为1的列表进行排序,如果有,立即返回。另外,我可能错了,但我认为对merge的调用在对mergesort的递归调用之后进行。

您的递归调用应该有一个终止条件,以便递归调用在某个点结束。 我认为在mergesort函数的开头添加以下条件可以解决问题:

if(l>r)
    return;

您需要在mergeSort函数中指定一个基本情况!而且,在mergeSort算法中,对merge的调用是在对左右子数组的递归调用之后进行的

您需要有一个基本大小写,这可能意味着您应该检查正在排序的数组的大小是否为=1,如果是,则返回该特定元素本身

在代码中,这意味着检查如下内容

l==r
另外,从逻辑上讲,应该在对两个子数组排序后调用merge

l==r