#include <stdio.h>
#include <stdlib.h>
//交换两个位置
void swap(int a[],int pos1,int pos2)
{
a[pos1]=a[pos1]^a[pos2];
a[pos2]=a[pos1]^a[pos2];
a[pos1]=a[pos1]^a[pos2];
}
//调整start点的堆结构
void fix_max_heap(int a[],int start,int num)
{
int max_child;
//有两个节点
if((start*2+1)<=num)
{
if(a[start*2]>a[start*2+1])
{
max_child=start*2;
}
else
{
max_child=start*2+1;
}
if(a[max_child]>a[start])
{
swap(a,start,max_child);
fix_max_heap(a,max_child,num);
}
}
//有一个节点
else if((start*2==num)&&(a[start*2]>a[start]))
{
swap(a,start,start*2);
}
}
/*建立堆 */
void build_max_heap(int a[],int num)
{
if(num==0||a==NULL)
return ;
int parent=num/2; //最小父节点
//从最小父节点开始调整堆
while(parent!=0)
{
fix_max_heap(a,parent,num);
parent--;
}
}
#define N 7
int main()
{
int a[]={-1,2,45,75,34,26,100,34};
//建立大顶堆
build_max_heap(a,N);
int i;
//删除最大数,调整堆
for(i=N;i>=2;i--)
{
swap(a,1,i);
fix_max_heap(a,1,i-1);
}
for(i=1;i<=N;i++)
{
printf("%d ",a[i]);
}
printf("\n");
system("pause");
return 1;
}