合并排序哪里错了求指导

小小浣熊 2013-05-23 08:53:58
#include "stdio.h"

#define N 8
#define MAX 65535


void merge(int test[],int start,int middle,int end);
void merge_sort(int test[],int start,int end);

int main(void)
{
int i,test[N]={12,14,52,3,1,63,25,8};

for(i=0;i<N;i++)
printf("%d\t",test[i]);

printf("\n");

merge_sort(test,0,N-1);

for(i=0;i<N;i++)
printf("%d\t",test[i]);
}

void merge_sort(int test[],int start,int end)
{
int t;
if(start< end)
{
t = ( start + end ) >> 1;
merge_sort( test, start, t );
merge_sort( test, t+1, end);
merge(test, start, t, end);
}

}


/*
*****************************************************************
******:函数功能:实现2个有序数组的合并
******:函数名 :merge(int test[],int p,int t,int r)
******:入口参数:test[]待排序数组,p数组开始位置,t数组中间分隔位置,r数组末尾位置
******:返回值 :无
*/

void merge(int test[],int start,int middle,int end)
{

int temp1[N]={0},temp2[N]={0};//定义并初始化辅助数组
int i,j,k;
int n1; //设置辅助数组1大小
int n2; //设置辅助数组2大小

n1=middle-start+1; //设置辅助数组1大小
n2=end-middle; //设置辅助数组2大小

for(i=0; i<n1; i++)
temp1[i]=test[start+i];

for(j=0; j<n2; j++)
temp2[j]=test[middle+j+1];

temp1[n1] = MAX; //给数组末尾赋予极大值方便操作
temp2[n2] = MAX;
i=start;
j=start;
for( k=start ;k<end ;k++ )
{
if( ( temp1[i] < temp2[j]) )
{
test[k]=temp1[i];
i++;
}
else
{
test[k]=temp2[j];
j++;
}

}

}
...全文
82 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
小小浣熊 2013-05-23
  • 打赏
  • 举报
回复
引用 2 楼 left_la 的回复:
66-81行,三个地方错误:
    i=0; // 1、初始化错误
    j=0; // 2、初始化错误
    for( k=start ;k<=end ;k++ ) // 3、K结束判断错误
    {
        if( ( temp1[i] < temp2[j]) )
        {
            test[k]=temp1[i];
            i++;
        }
        else 
        {
            test[k]=temp2[j];
            j++;
        }
 
    }
恩恩谢谢了
小小浣熊 2013-05-23
  • 打赏
  • 举报
回复
引用 楼主 wangyudong211 的回复:
#include "stdio.h"

#define N 8
#define MAX 65535


void merge(int test[],int start,int middle,int end);
void merge_sort(int test[],int start,int end);

int main(void)
{
	int i,test[N]={12,14,52,3,1,63,25,8};

	for(i=0;i<N;i++)
		printf("%d\t",test[i]);

	printf("\n");

	merge_sort(test,0,N-1);
	
	for(i=0;i<N;i++)
		printf("%d\t",test[i]);
}

void merge_sort(int test[],int start,int end)
{
	int t;
	if(start< end)
	{
		t = ( start + end ) >> 1;
		merge_sort( test, start, t );
		merge_sort( test, t+1, end);
		merge(test, start, t, end);
	}
	
}


/*
*****************************************************************
******:函数功能:实现2个有序数组的合并
******:函数名  :merge(int test[],int p,int t,int r)
******:入口参数:test[]待排序数组,p数组开始位置,t数组中间分隔位置,r数组末尾位置
******:返回值  :无
*/

void merge(int test[],int start,int middle,int end)
{

	int temp1[N]={0},temp2[N]={0};//定义并初始化辅助数组
	int i,j,k;
	int n1;   //设置辅助数组1大小
	int n2;     //设置辅助数组2大小

	 n1=middle-start+1;   //设置辅助数组1大小
	 n2=end-middle;     //设置辅助数组2大小

	for(i=0; i<n1; i++)
		temp1[i]=test[start+i];

	for(j=0; j<n2; j++)
		temp2[j]=test[middle+j+1];

	temp1[n1] = MAX;    //给数组末尾赋予极大值方便操作
	temp2[n2] = MAX;
	i=start;
	j=start;
	for( k=start ;k<end ;k++ )
	{
		if( ( temp1[i] < temp2[j]) )
		{
			test[k]=temp1[i];
		 	i++;
		}
		else 
		{
			test[k]=temp2[j];
			j++;
		}

	}

}
引用 楼主 wangyudong211 的回复:
#include "stdio.h"

#define N 8
#define MAX 65535


void merge(int test[],int start,int middle,int end);
void merge_sort(int test[],int start,int end);

int main(void)
{
	int i,test[N]={12,14,52,3,1,63,25,8};

	for(i=0;i<N;i++)
		printf("%d\t",test[i]);

	printf("\n");

	merge_sort(test,0,N-1);
	
	for(i=0;i<N;i++)
		printf("%d\t",test[i]);
}

void merge_sort(int test[],int start,int end)
{
	int t;
	if(start< end)
	{
		t = ( start + end ) >> 1;
		merge_sort( test, start, t );
		merge_sort( test, t+1, end);
		merge(test, start, t, end);
	}
	
}


/*
*****************************************************************
******:函数功能:实现2个有序数组的合并
******:函数名  :merge(int test[],int p,int t,int r)
******:入口参数:test[]待排序数组,p数组开始位置,t数组中间分隔位置,r数组末尾位置
******:返回值  :无
*/

void merge(int test[],int start,int middle,int end)
{

	int temp1[N]={0},temp2[N]={0};//定义并初始化辅助数组
	int i,j,k;
	int n1;   //设置辅助数组1大小
	int n2;     //设置辅助数组2大小

	 n1=middle-start+1;   //设置辅助数组1大小
	 n2=end-middle;     //设置辅助数组2大小

	for(i=0; i<n1; i++)
		temp1[i]=test[start+i];

	for(j=0; j<n2; j++)
		temp2[j]=test[middle+j+1];

	temp1[n1] = MAX;    //给数组末尾赋予极大值方便操作
	temp2[n2] = MAX;
	i=start;
	j=start;
	for( k=start ;k<end ;k++ )
	{
		if( ( temp1[i] < temp2[j]) )
		{
			test[k]=temp1[i];
		 	i++;
		}
		else 
		{
			test[k]=temp2[j];
			j++;
		}

	}

}
恩恩判断条件还有问题
jimye 2013-05-23
  • 打赏
  • 举报
回复
66-81行,三个地方错误:
    i=0; // 1、初始化错误
    j=0; // 2、初始化错误
    for( k=start ;k<=end ;k++ ) // 3、K结束判断错误
    {
        if( ( temp1[i] < temp2[j]) )
        {
            test[k]=temp1[i];
            i++;
        }
        else 
        {
            test[k]=temp2[j];
            j++;
        }
 
    }
Jackie_Zhu 2013-05-23
  • 打赏
  • 举报
回复
line 66,67

    i=start;    j=start;
初始化错了,应该是

    i=0;    j=0;

69,377

社区成员

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

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