主题:时间复杂度问题,挺郁闷的~
			
 便签
				 [专家分:40]  发布于 2006-05-10 22:58:00							
			是有关并归排序的,由于有好几个递归,不知道怎么求了
void mergesort(int i,int j)
{
  int m;
  if(i!=j)
{
   m=(i+j)/2;
mergesort(i,m);//这两句挺烦的,不知道如何解决,主要是有两个递归,一个的话能解
mergesort(m+1,j);//决.
merge(i,j,m);
}
}
						
					 
		
			
回复列表 (共4个回复)
		
								
				沙发
				
					
hanshuyujifen [专家分:800]  发布于 2006-05-11 01:58:00				
				merge(i,j,m)是什么?
将数分成两部分
mergesort(i,m);//先弄前一半
mergesort(m+1,j);//再弄后一半
没什么难理解的呀?
主要操作应该是交换什么吧!!
初学!!有不对的地方,清指正!!
							 
						
				板凳
				
					
便签 [专家分:40]  发布于 2006-05-11 11:10:00				
				呵呵,也是初学,归并的算法理解,就是时间复杂度,不知怎么求。
							 
						
				3 楼
				
					
boxertony [专家分:23030]  发布于 2006-05-11 11:14:00				
				主要还得看你的 merge函数的实现,
"mergesort(i,m);//这两句挺烦的,不知道如何解决,主要是有两个递归,一个的话能解" 根本不用你管,因为是递归的呀
假设merge的时间复杂度是g(n),mergesort的是f(n),则
f(n) = 2f(n/2) + g(n)
然后根据这个递推公式求出通项公式就可以了呀。
既然是归并排序,肯定g(n)=n
所以f(n)=2f(n/2)+n = 2[2f(n/4)+n/2] + n 
        = 4f(n/4) + 2n  = 2^k*f(n/2^k) + k*n
如果k=log2(n)
则f(n) = n*f(1) + n*log2(n)
        
							 
						
				4 楼
				
					
便签 [专家分:40]  发布于 2006-05-11 11:18:00				
				谢谢楼上朋友,正解啊!!!
							 
									
			
我来回复