堆
堆是一个经常使用数组顺序存储的二叉树,分为最大堆和最小堆两种。以最大堆为例,对于除了根节点之外的每一个结点,至多与其父节点一样大。
MAX_HEAPIFY函数
作用:对于以i结点为根节点的树,它的左右子树都是最大堆,但是i结点不一定是最大元素,调整i结点的位置,使整个树都满足最大堆的性质
这个函数是维护最大堆的关键
复杂度:O(lgn)
//本代码中数列从1开始
void max_heapify(int a[],int i,int n)
{
int l=2*i,r=2*i+1;
int largest=i;
if(l<=n&&a[l]>a[i])
largest=l;
if(r<=n&&a[r]>a[largest])
largest=r;
if(largest!=i)
{
int temp;
temp=a[i];
a[i]=a[largest];
a[largest]=temp;
max_heapify(a,largest,n);
}
}
BUILD_MAX_HEAP函数
功能:把一个无序数组变为最大堆
复杂度:O(n)
void build_max_heap(int a[],int n)
{
int i;
for(i=n/2;i>=1;i--)
max_heapify(a,i,n);
}
堆排序算法HEAP_SORT
功能:排序
思路:先把序列变成最大堆,把最大值根节点跟最末元素换位,该点就应该在这个位置,此后该点不再参与排序(n–)
//从1开始
void heap_sort(int a[],int size)
{
build_max_heap(a,size);
int temp;
for(i=size;i>=2;i--)
{
temp=a[1];
a[1]=a[i];
a[i]=temp;
size--;
max_heapify(a,1,size);
}
}
HEAP_INSERT
向堆中插入一个元素
此处num为插入后的元素个数
void heap_insert(int a[],int num,int x)
{
a[num]=x;
int i,temp;
for(i=num;i>1&&a[i/2]<a[i];i/=2)
{
temp=a[i];
a[i]=a[i/2];
a[i/2]=temp;
}
}
HEAP_DELETE
删除堆中最大的元素(根节点)
此处num为删除后的元素个数
void heap_delete(int a[],int num)
{
a[1]=a[num+1];
max_heapify(a,1,num);
}