堆一般是完全二叉树,可以用数组存储。
下调操作,这里以大根堆为例:
void downAdjust(int low,int high)
{
int i=low,j=i*2;
while(j<=high){
if(j+1<=high&&heap[j+1]>heap[j]){
j=j+1;
}
if(heap[j]>heap[i]){
swap(heap[j],heap[i]);
i=j;
j=i*2;
}else{
break;
}
}
}
建堆:
void CreateHeap(){
rFOR(i,n/2,1)
downAdjust(i,n);
}
删除堆顶元素:
void deleteTop()
{
heap[1]=heap[n--];
downAdjust(1,n);
}
上调操作:
void upAdjust(int low,int high)
{
int i=high,j=i/2;
while(j>=low){
if(heap[j]<heap[i]){
swap(heap[j],heap[i]);
i=j;j=i/2;
}else{
break;
}
}
}
插入元素:
void insertheap(int x){
heap[++n]=x;
upAdjust(1,n);
}
堆排序:
void heapSort(){
CreateHeap();
rFOR(i,n,2)
{
swap(heap[i],heap[1]);
downAdjust(1,i-1);
}
}