回 帖 发 新 帖 刷新版面

主题:C下如何把数组中的数堆化?急!谢谢

我用随即函数产生了一个一维数组R[N],N已经用#define n 300定义了,我想问下,如何把这个数组中的数堆化,不涉及堆排序。。只要堆化。。看了书上的例子,堆化的思想的我看的懂,但程序写不出来。。 谢谢,,这个事很急,旁边没知道的,所以发帖求帮助了 

 我的邮箱:yangqi506@tom.com  QQ:305702473  谢了

回复列表 (共5个回复)

沙发

#include "stdlib.h"
#include"time.h"
#include "stdio.h"
#define n 7
int r[n];
main()
{
 int i,j,k,temp;
 int a,b;
 randomize();                  /*get the number write into r[]*/
 for(b=0; b<10; b++)
  {
    for(a=1;a<n;a++)
     r[a]=rand() % 3000;
  }
HeapAdjust(&r,1);
for(a=1;a<n;a++)              /*test*/
   {printf("r[%d] is %d\n", a,r[a]);}
}
HeapAdjust(int *r,int s)
{
int rc,j;
rc=*(r+s);
for(j=2*s;j<=n;j*=2)
{
 if(j<n&&(r[j]<r[j+1])) j++;
 if(rc>r[j]) break;
 r[s]=r[j]; s=j;
 }
r[s]=rc;
}



里面的初始建堆函数HeapAdjust,我先只用了6个数来实验下,懂的帮我看下,万分感激

板凳

void sift(int *x, int n, int s)
{
int t,k,j;
t=*(x+s); /*暂存开始元素*/
k=s;  /*开始元素下标*/
j=2*k+1; /*右子树元素下标*/
while(j<n)
 {
  if(j<n-1&&*(x+j)<*(x+j+1))/*判断是否满足堆的条件:满足就继续下一轮比较,否则调整*/
  {
   j++;
  }
 if(t<*(x+j)) /*调整*/
  {
   *(x+k)=*(x+j);
   k=j; /*调整后,开始元素也随之调整*/
   j=2*k+1;
  }
  else /*没有需要调整了,已经是个堆了,退出循环。*/
  {
   break;
  }
 }
 *(x+k)=t; /*开始元素放到它正确位置*/
}



(堆化函数)  呵呵,希望一样再找这个函数的同志有点帮助

3 楼

自己总于搞清楚了,现把代码贴出来,希望给 再找这做这个类时的同学有点帮助,
这个是建大顶堆的函数,顺便BS下自己
 heap_adjust(long *x,long i)
{
int rc,j,c;
rc=x[i];
j=2*i;
while(j<=n)
 {
  if(j<=n&&x[j]<x[j+1]) j=j+1;  /*qu hai zi de da zhe*/
   if(x[i]<x[j])
    {
     c=x[i];x[i]=x[j];x[j]=c;
     i=j;j=2*i;
     }
    else
    break;
  }
 x[i]=rc;
}
big_heap(long *y,long i)
{
 for(i=(n/2);i>=1;i--)
 heap_adjust(y,i);
 }

4 楼

对前一半的元素从后至前均做一次下滤

5 楼

3Q了,楼上的

我来回复

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