主题:堆排序
avenger07
[专家分:160] 发布于 2006-11-11 23:40:00
这是我自己写的堆排序,可是怎么输出的结果并没有排序?
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define max 20
typedef struct slnode
{
int key;
}slnode;
typedef struct sqlist
{
slnode r[max];
int length;
}sqlist;
void heapsort(sqlist *p)
{
sqlist *l,*x;
int i,j;
l=p;
for(i=l->length/2;i>0;--i)
heapadjust(l,i,l->length);
for(i=l->length;i>1;--i)
{
l->r[0]=l->r[1];
l->r[1]=l->r[i];
l->r[i]=l->r[0];
}
}
heapadjust(sqlist *p,int x,int length)
{
sqlist *l;
int i,j,k,m,s,rc;
l=p;
s=x;
m=length;
rc=l->r[s].key;
for(j=2*m;j<=m;j*=2)
{
if(j<m && l->r[j].key<l->r[j+1].key) ++j;
if(rc>l->r[j].key) break;
l->r[s]=l->r[j];
s=j;
}
l->r[s].key=rc;
}
main()
{
sqlist *p;
int i,j;
p=(struct sqlist *) malloc (sizeof(struct sqlist));
printf("\ninput the sequence of key:");
for(i=1;i<max;i++)
{
scanf("%d",&p->r[i].key);
p->length=i;
if(p->r[i].key==999)
{
p->r[i].key=0;
p->length=i-1;
break;
}
}
heapsort(p);
for(i=1;i<p->length+1;i++)
{
printf("\np->r[%d].key=%d\n",i,p->r[i].key);
}
}
回复列表 (共9个回复)
沙发
dorremon1992 [专家分:870] 发布于 2006-11-12 19:55:00
看起来差不多 从编一下呢?
板凳
max810511 [专家分:170] 发布于 2006-11-13 14:25:00
呵呵,看来你是马虎了,落了一句很重要的:
heapadjust(l,i,l->length);
我想你知道这句应该加在哪。
3 楼
avenger07 [专家分:160] 发布于 2006-11-14 01:14:00
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define max 20
typedef struct slnode
{
int key;
}slnode;
typedef struct sqlist
{
slnode r[max];
int length;
}sqlist;
void heapsort(sqlist *p)
{
sqlist *l,*x;
int i,j;
l=p;
for(i=l->length/2;i>0;--i)
heapadjust(l,i,l->length);
for(i=l->length;i>1;--i)
{
l->r[0]=l->r[1];
l->r[1]=l->r[i];
l->r[i]=l->r[0];
heapadjust(l,1,i-1);
}
}
heapadjust(sqlist *p,int x,int length)
{
sqlist *l,*rc;
int i,j,k,m,s;
rc=(struct sqlist *) malloc (sizeof(struct sqlist));
l=p;
s=x;
m=length;
rc->r[0]=l->r[s];
for(j=2*m;j<=m;j*=2)
{
if(j<m && l->r[j].key<l->r[j+1].key) ++j;
if(rc>l->r[j].key) break;
l->r[s]=l->r[j];
s=j;
}
l->r[s]=rc->r[0];
}
main()
{
sqlist *p;
int i,j;
p=(struct sqlist *) malloc (sizeof(struct sqlist));
printf("\ninput the sequence of key:");
for(i=1;i<max;i++)
{
scanf("%d",&p->r[i].key);
p->length=i;
if(p->r[i].key==999)
{
p->r[i].key=0;
p->length=i-1;
break;
}
}
heapsort(p);
for(i=1;i<p->length+1;i++)
{
printf("\np->r[%d].key=%d\n",i,p->r[i].key);
}
}
还是不对,是不是我的这个输出有问题,急盼回复
4 楼
雨523 [专家分:200] 发布于 2006-11-14 15:27:00
牛,这样的程序也写得出来,而且能调试.
5 楼
max810511 [专家分:170] 发布于 2006-11-15 13:16:00
heapadjust函数中的
for(j=2*m;j<=m;j*=2)
有毛病,应该是:
for(j=2*s;j<=m;j*=2)
6 楼
雨523 [专家分:200] 发布于 2006-11-16 16:53:00
这道题的headadjust部份的rc申请空间看上去挺怪的
估计是headadjust部份的调整有出入
7 楼
雨523 [专家分:200] 发布于 2006-11-16 17:20:00
已经调试出来了,修改一下rc的键值为rc.r[0].key即可.最后得到一个大顶堆排序算法,逆过来刚好是从小到大的输出.
8 楼
雨523 [专家分:200] 发布于 2006-11-16 17:22:00
//堆排序 2006/11/16
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define max 20
typedef struct slnode
{
int key;
}slnode;
typedef struct sqlist
{
slnode r[max];
int length;
}sqlist;
void heapsort(sqlist *p)
{
sqlist *l,*x;
int i,j;
l=p;
for(i=l->length/2;i>0;--i)
heapadjust(l,i,l->length);
for(i=l->length;i>1;--i)
{
l->r[0]=l->r[1];
l->r[1]=l->r[i];
l->r[i]=l->r[0];
heapadjust(l,1,i-1);
}
}
heapadjust(sqlist *p,int x,int length)
{
sqlist *l,*rc;
int i,j,k,m,s;
rc=(struct sqlist *) malloc (sizeof(struct sqlist));
l=p;
s=x;
m=length;
rc->r[0].key=l->r[s].key;
for(j=2*s;j<=m;j*=2)
{
if(j<m && l->r[j].key<l->r[j+1].key) ++j;
if(rc->r[0].key>=l->r[j].key) break;
l->r[s].key=l->r[j].key;
s=j;
}
l->r[s].key=rc->r[0].key;
}
main()
{
sqlist *p;
int i,j;
p=(struct sqlist *) malloc (sizeof(struct sqlist));
printf("\ninput the sequence of key:");
for(i=1;i<max;i++)
{
scanf("%d",&p->r[i].key);
p->length=i;
if(p->r[i].key==999)
{
p->r[i].key=0;
p->length=i-1;
break;
}
}
heapsort(p);
for(i=1;i<p->length+1;i++)
{
printf("\np->r[%d].key=%d\n",i,p->r[i].key);
}
}
9 楼
雨523 [专家分:200] 发布于 2006-11-16 17:25:00
heapadjust(sqlist *p,int x,int length)
{
sqlist *l,*rc;
int i,j,k,m,s;
rc=(struct sqlist *) malloc (sizeof(struct sqlist));
l=p;
s=x;
m=length;
rc->r[0].key=l->r[s].key;
for(j=2*s;j<=m;j*=2)
{
if(j<m && l->r[j].key<l->r[j+1].key) ++j;
if(rc->r[0].key>=l->r[j].key) break;
l->r[s].key=l->r[j].key;
s=j;
}
l->r[s].key=rc->r[0].key;
}
关键部份是修改了这个算法.
我来回复