归并排序和递归调用

走在路上的人吧 2011-07-19 10:11:06
#include<stdio.h>
void main()
{
int a[10]={9,1,3,2,5,7,8,4};
void f(int a[],int n);
void g(int a[],int x,int y);
int i;
int r[100];
f(a,8);
for(i=0;i<8;i++)
printf("%d\t",a[i]);
}

void g(int a[],int x,int y)
{
int i,j,k;
int b[8],c[8],r[8];
for(i=0;i<x;i++)
b[i]=a[i];
for(j=0;j<y;i++,j++)
c[j]=a[i];
for(i=0,j=0,k=0;j<x&&k<y;i++)
{if(b[j]<=c[k])
{
r[i]=b[j];
j++;
}
if(b[j]>c[k])
{
r[i]=c[k];
k++;
}
}
if(j==x)
for(;k<y;k++,i++)
r[i]=c[k];
if(k==y)
for(;j<x;j++,i++)
r[i]=b[j];
for(i=0;i<x+y;i++)
a[i]=r[i];printf("x=%d,y=%d\t",x,y);
for(i=0;i<8;i++)
printf("%d\t",a[i]);printf("***\n");
}

void f(int a[],int n) //////////////递归
{ int x,y;
if(n==1)
return;
if(n>1)
{if(n%2==0)
x=y=n/2;
else
{x=n/2+1;
y=n/2;
}
f(a,x);
f(a,y);
g(a,x,y);
}
}
这个程序目的是实现归并排序,但是出错了,同志指导下,主要讨论下,递归调用的实质
...全文
141 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
归并排序
  • 打赏
  • 举报
回复
你的代码没看懂,帖一个百度上的

#include <stdio.h>

void Merge(int array[], int p, int q, int r)
{
int i, k;
int begin1,end1,begin2,end2;
int* temp = (int*)malloc((r-p+1)*sizeof(int));
begin1= p;
end1 = q;
begin2 = q + 1;
end2 = r;
k = 0;

while((begin1 <= end1)&&( begin2 <= end2))
{
if(array[begin1] < array[begin2])
{
temp[k] = array[begin1];
begin1++;
}
else
{
temp[k] = array[begin2];
begin2++;
}
k++;
}
while(begin1<=end1)
{
temp[k++] = array[begin1++];
}
while(begin2<=end2)
{
temp[k++] = array[begin2++];
}
for (i = 0; i <= (r - p); i++)
array[p+i] = temp[i];
free(temp);
}
void MergeSort(int array[], int first, int last)
{
int mid = 0;

if(first < last)
{
mid = (first + last) / 2;
MergeSort(array, first, mid);
MergeSort(array, mid + 1,last);
Merge(array, first, mid, last);
}
}

void main()
{
int data[] = {10 , 6, 9, 3, 8, 2, 5,7, 1, 4};
int i;

MergeSort(data, 0, 9);
for (i = 0; i < 10; i++)
{
printf("%d ", data[i]);
}
}

执行结果:

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

p.c
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:p.exe
p.obj

H:\pro>p
1 2 3 4 5 6 7 8 9 10
H:\pro>


「已注销」 2011-07-19
  • 打赏
  • 举报
回复
改了一下,至少看着没有错误了,不知道你的题目是什么。

void g(int a[],int x,int y)
{
int i,j,k;
int b[8],c[8],r[8];
for (i=0;i<x;i++)
b[i]=a[i];
for (j=0;j<y;i++,j++)
c[j]=a[i];
for (i=0,j=0,k=0;j<x&&k<y;i++)
{
if (b[j]<=c[k])
{
r[i]=b[j];
j++;
}
else//这个地方你那个应该不对,如果第一个判断成立,第二个也可能成立,那就错了。
{
r[i]=c[k];
k++;
}
}
if (j==x)
for (;k<y;k++,i++)
r[i]=c[k];
if (k==y)
for (;j<x;j++,i++)
r[i]=b[j];
for (i=0;i<x+y;i++)
a[i]=r[i];
printf("x=%d,y=%d\t",x,y);
for (i=0;i<8;i++)
printf("%d\t",a[i]);
printf("***\n");
}
金刚葫芦娃 2011-07-19
  • 打赏
  • 举报
回复
帮你UP..

69,373

社区成员

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

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