用分治法排序,大家看看出什么问题了。

程序猿Theg 2013-04-27 05:58:41
小弟新手,对递归掌握的不是很好,这是看书把伪代码翻译过来的,麻烦大神们看看哪里出问题了。
#include<stdio.h>
void MERGE(int *A,int p,int q,int r);
void MERGE_SORT(int *A,int p,int r);

int main()
{
int a[5]={1,5,7,8,4};
int i;
MERGE_SORT(a,0,4);
for(i=0;i<5;i++)
{
printf("%d ",a[i]);
}
return 0;
}

void MERGE(int *A,int p,int q,int r)
{
int L[3],R[3];
int i,j,k;
for(i=0;i<=r;i++)
{
if(i<=q)
L[i]=A[i];
else
R[i-q-1]=A[i];
}
if((r/2)*2!=r)
{
j=(r-1)/2;
k=(r-1)/2;
}
else
{
j=r/2;
k=(r-1)/2;
}
for(i=r;i>=0;i--)
{
if(L[j]>=R[k])
{
A[i]=L[j];
j-=1;
}
else
{
A[i]=R[k];
k-=1;
}
}
//printf("%d,%d\n",L[0],L[1]);
//printf("%d,%d\n",R[0],R[1]);
}

void MERGE_SORT(int *A,int p,int r)
{
int q;
if(p<r)
{
q=r/2;
MERGE_SORT(A,p,q);
MERGE_SORT(A,q+1,r);
MERGE(A,p,q,r);
}
if(p>=r)
MERGE(A,p,q,r);
}

问题应该是出在函数void MERGE_SORT(int *A,int p,int r)的递归中,求解答啊!!!
...全文
132 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序猿Theg 2013-04-30
  • 打赏
  • 举报
回复
谢谢大家哈,小弟努力学习。
derekrose 2013-04-29
  • 打赏
  • 举报
回复
递归部分应该这样写

public void MergerSort(int[] v, int first, int last)
       {
           if (first + 1 < last)
           {
               int mid = (first + last) / 2;
               MergerSort(v, first, mid);
               MergerSort(v, mid, last);
               Merger(v, first, mid, last);
           }
       }
你看看有什么不同
derekrose 2013-04-29
  • 打赏
  • 举报
回复
int q; if(p<r) { q=r/2; MERGE_SORT(A,p,q); MERGE_SORT(A,q+1,r); MERGE(A,p,q,r); } if(p>=r) MERGE(A,p,q,r); 如果进入第二个循环,那么q就是未定义的,你让编译器怎么merge
14号选手 2013-04-29
  • 打赏
  • 举报
回复
可以参考下我的这篇博文http://blog.csdn.net/xuchao1229/article/details/8167689
艾薇儿More 2013-04-28
  • 打赏
  • 举报
回复
合并两个排序好的(这里从小到大)数组的方法不对。没仔细看,思路不清晰,没注释不好揣摩你的意图
艾薇儿More 2013-04-28
  • 打赏
  • 举报
回复
只是你没写过而已。纯属个人理解。你把MERGE_SORT()这个函数就看成一个排序的功能模块,它就能实现的就是对p至q的排序和q+1至n的排序,而MERGE()就是实现将排序好的两个数组进行合并的。只不过通过一步步的递归结果就是从开始慢慢排序合并过程。
程序猿Theg 2013-04-28
  • 打赏
  • 举报
回复
引用 2 楼 zshuaiqin 的回复:
不好意思,c也是可以的,我上面说的段错误是因为我把malloc分配大小给搞错了,
#include<stdio.h>
#include<stdlib.h>
void MERGE(int *A,int p,int q,int r,int m);
void MERGE_SORT(int *A,int p,int r);
int main()
{
	int i = 0;
	int a[6]={9,2,8,4,5,6};
     MERGE_SORT(a,0,5);	
	for(;i<6;i++)
	{
		printf("%d\n",a[i]);
	}
	return 0;
}

void MERGE(int *A,int p,int q,int r,int m){
	int i,j,k;
	int *b = (int *) malloc (sizeof(int)*m);
	i = p;
	j = q+1;
	k = 0;
	while(i<=q&&j<=r)
	{
		if(A[i]>A[j])
		{
			b[k++] = A[j++];
		}
		else
			b[k++] = A[i++];

	}
	if(i==q+1)
	{
      for(;j<=r;j++)
		  b[k++] = A[j];
	}
	else
	{
		for(;i<=q;i++)
		{
			b[k++] = A[i];

		}
	}
	k=0;
	for(i=p;i<r+1;i++)
		A[i]=b[k++];
	free(b);

}

void MERGE_SORT(int *A,int p,int n){
		if(p<n){
			int q;
			q=(n+p)/2;
		MERGE_SORT(A,p,q);
		MERGE_SORT(A,q+1,n);
		MERGE(A,p,q,n,n-p+1);
	
	}
	

}
能告诉我下上面是哪里出问题了吗?还有递归那里能不能解释一下。。大神,说得好就给你分!
艾薇儿More 2013-04-27
  • 打赏
  • 举报
回复
不好意思,c也是可以的,我上面说的段错误是因为我把malloc分配大小给搞错了,
#include<stdio.h>
#include<stdlib.h>
void MERGE(int *A,int p,int q,int r,int m);
void MERGE_SORT(int *A,int p,int r);
int main()
{
	int i = 0;
	int a[6]={9,2,8,4,5,6};
     MERGE_SORT(a,0,5);	
	for(;i<6;i++)
	{
		printf("%d\n",a[i]);
	}
	return 0;
}

void MERGE(int *A,int p,int q,int r,int m){
	int i,j,k;
	int *b = (int *) malloc (sizeof(int)*m);
	i = p;
	j = q+1;
	k = 0;
	while(i<=q&&j<=r)
	{
		if(A[i]>A[j])
		{
			b[k++] = A[j++];
		}
		else
			b[k++] = A[i++];

	}
	if(i==q+1)
	{
      for(;j<=r;j++)
		  b[k++] = A[j];
	}
	else
	{
		for(;i<=q;i++)
		{
			b[k++] = A[i];

		}
	}
	k=0;
	for(i=p;i<r+1;i++)
		A[i]=b[k++];
	free(b);

}

void MERGE_SORT(int *A,int p,int n){
		if(p<n){
			int q;
			q=(n+p)/2;
		MERGE_SORT(A,p,q);
		MERGE_SORT(A,q+1,n);
		MERGE(A,p,q,n,n-p+1);
	
	}
	

}
艾薇儿More 2013-04-27
  • 打赏
  • 举报
回复
你那个合并数组有点问题,还有就是用c感觉会造成段错误,c++可以用,不知道理解对不对你暂且看看吧
#include<iostream.h>
void MERGE(int *A,int p,int q,int r,int m);
void MERGE_SORT(int *A,int p,int r);
int main()
{
	int i = 0;
	int a[5]={1,5,7,8,4};
     MERGE_SORT(a,0,4);	
	for(;i<5;i++)
	cout<<a[i]<<endl;
	return 0;
}

void MERGE(int *A,int p,int q,int r,int m){
	int i,j,k;
	int *b = new int[m];
	i = p;
	j = q+1;
	k = 0;
	while(i<=q&&j<=r)
	{
		if(A[i]>A[j])
		{
			b[k++] = A[j++];
		}
		else
			b[k++] = A[i++];

	}
	if(i==q+1)
	{
      for(;j<=r;j++)
		  b[k++] = A[j];
	}
	else
	{
		for(;i<=q;i++)
		{
			b[k++] = A[i];

		}
	}
	k=0;
	for(i=p;i<r+1;i++)
		A[i]=b[k++];
delete b ;

}

void MERGE_SORT(int *A,int p,int n){
		if(p<n){
			int q;
			q=(n+p)/2;
		MERGE_SORT(A,p,q);
		MERGE_SORT(A,q+1,n);
		MERGE(A,p,q,n,n-p+1);
	
	}
	

}

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧