以下内容展示了堆的创建,在堆中删除和插入元素等操作。
#include<stdio.h>
#define MAX 15
void makeHeap(int a[],int n);
void swap(int *a,int *b);
void sift_down(int a[],int s,int n);
void sift_up(int a[],int s);
void heapSort(int a[],int n);
void visit(int a[],int n);
void insert(int a[],int elem,int *n);
void hdelete(int a[],int i,int &n);
int main()
{
int n,i;
int a[MAX];
FILE*fp;
fp=fopen("F:\\Homework\\c\\123.txt","r");//数据来源于文件
printf("enter n:\n");
scanf("%d",&n);
for(i=1;i<=n;i++) //从数组‘1’位置开始
fscanf(fp,"%d",&a[i]);
fclose(fp);
visit(a,n);
makeHeap(a,n);
heapSort(a,n);
visit(a,n);
return 0;
}
void makeHeap(int a[],int n)
{
int i;
for(i=n/2;i>=1;i--) //从最后一个带有子节点的父节点开始调整,直至根节点。
sift_down(a,i,n);
printf("Makeheap successfully!\n");
}
void swap(int *a,int *b) //交换两个数
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
//功能:对位置为s的节点进行向下调整
//s表示待调整的位置,n表示堆中元素的个数
void sift_down(int a[],int s,int n) //
{
int child=2*s;
int index;
while(child<=n)
{
if(child+1<=n)
a[child]>a[child+1]?index=child:index=child+1;
else
index=child;
if(a[s]<a[index])
{
swap(&a[s],&a[index]);
if(index==child) /*********重要!!!********/
s=child;
else
s=child+1;
child=2*s;
}
else
return;
}
}
//功能:对位置为s的元素进行上调整
void sift_up(int a[],int s)
{
while(s/2>=1)
{
if(a[s]>a[s/2])
{
swap(&a[s],&a[s/2]);
s=s/2;
}
else
break;
}
}
void heapSort(int a[],int n)
{
int i;
for(i=n;i>=1;i--)
{
swap(&a[1],&a[i]);
sift_down(a,1,i-1);
}
printf("sort successfully!\n");
}
void visit(int a[],int n)
{
int i;
for(i=n;i>=1;i--)
printf("%d ",a[i]);
printf("\nvisit all\n");
}
void insert(int a[],int elem,int *n)
{
if(*n+1<=MAX)
{
(*n)++;
a[*n]=elem;
sift_up(a,*n);
}
visit(a,*n);
}
void hdelete(int a[],int i,int &n)
{
swap(&a[i],&a[n]);
n--;
if(a[i]>a[n])
sift_down(a,i,n);
else
sift_up(a,i);
}