主题:C下如何把数组中的数堆化?急!谢谢
yangqi506
[专家分:0] 发布于 2007-05-02 12:30:00
我用随即函数产生了一个一维数组R[N],N已经用#define n 300定义了,我想问下,如何把这个数组中的数堆化,不涉及堆排序。。只要堆化。。看了书上的例子,堆化的思想的我看的懂,但程序写不出来。。 谢谢,,这个事很急,旁边没知道的,所以发帖求帮助了
我的邮箱:yangqi506@tom.com QQ:305702473 谢了
回复列表 (共5个回复)
沙发
yangqi506 [专家分:0] 发布于 2007-05-02 19:16:00
#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个数来实验下,懂的帮我看下,万分感激
板凳
yangqi506 [专家分:0] 发布于 2007-05-08 08:41:00
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 楼
yangqi506 [专家分:0] 发布于 2007-06-08 14:54:00
自己总于搞清楚了,现把代码贴出来,希望给 再找这做这个类时的同学有点帮助,
这个是建大顶堆的函数,顺便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 楼
bpttc [专家分:8790] 发布于 2007-06-09 09:54:00
对前一半的元素从后至前均做一次下滤
5 楼
yangqi506 [专家分:0] 发布于 2007-06-09 11:35:00
3Q了,楼上的
我来回复