回 帖 发 新 帖 刷新版面

主题:堆排序

这是我自己写的堆排序,可是怎么输出的结果并没有排序?
#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个回复)

沙发

看起来差不多 从编一下呢?

板凳

呵呵,看来你是马虎了,落了一句很重要的:
heapadjust(l,i,l->length);
我想你知道这句应该加在哪。

3 楼

#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 楼

牛,这样的程序也写得出来,而且能调试.

5 楼

heapadjust函数中的
  for(j=2*m;j<=m;j*=2)
有毛病,应该是:
  for(j=2*s;j<=m;j*=2)

6 楼

这道题的headadjust部份的rc申请空间看上去挺怪的

估计是headadjust部份的调整有出入

7 楼

已经调试出来了,修改一下rc的键值为rc.r[0].key即可.最后得到一个大顶堆排序算法,逆过来刚好是从小到大的输出.

8 楼

//堆排序  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 楼

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;

}


关键部份是修改了这个算法.

我来回复

您尚未登录,请登录后再回复。点此登录或注册