[英]mergesort algorithm in c++
我有以下代码
#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;
}
但这是警告
1>------ Rebuild All started: Project: mergesort, Configuration: Debug Win32 ------
1> mergesort.cpp
1>d:\c++_algorithms\mergesort\mergesort\mergesort.cpp(24): warning C4717: 'mergesort' : recursive on all control paths, function will cause runtime stack overflow
1> mergesort.vcxproj -> D:\c++_algorithms\mergesort\Debug\mergesort.exe
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
请帮我解决
我已经更新了我的代码
mergesort()需要检测是否要求对长度为一的列表进行排序,如果是,则立即返回。 另外,我可能是错的,但是我认为对merge()的调用是在对mergesort()的递归调用之后进行的。
您的递归调用应具有终止条件,以便递归调用将在某个时刻结束。
我认为在您的mergesort函数的开头添加以下条件可以解决此问题:
if(l>r)
return;
您需要有一个基本情况,这可能意味着您应该检查要排序的数组的大小是否为= 1,如果是,则返回该特定元素本身。
在代码中,这意味着检查类似
l==r
同样,从逻辑上讲,应该在对两个子数组进行排序之后调用merge。
您需要在mergeSort函数中指定基本情况! 而且,在mergeSort算法中,合并调用是在对左侧和右侧子数组进行递归调用之后进行的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.