1.什么是堆?
堆是一棵完全二叉树。
每一个节点的值都不小于(或大于)其子节点的值。
2.建堆处理:
向下调整:
int *heap;//最大堆
//low是数组欲要调整节点的位置,high是堆最高节点的坐标
void downAdjust(){
int i=low,j=i*2;
while(j<=high){
if(j+1<=high&&heap[j]<heap[j+1]){//判断右儿子是否大于左儿子
j=j+1;
}
if(heap[j]>heap[i]){
swap(heap[i],heap[j]);
i=j;
j=i*2
}
else{
break;
}
}
}
向上调整
int *heap;//最大堆
//high是数组欲要调整节点的位置,low是堆最高节点的坐标
void upAdjust(){
int i=high,j=high/2;
while(j>=low){
if(heap[j]<heap[i]){
swap(heap[i],heap[j]);
i=j;
j=i/2
}
else{
break;
}
}
}
删除堆顶元素
void deletTop(int v){
heap[1]=heap[n--];
downAdjust(1,n);
}
建堆:
void createHeap(){
for(int i=N/2;i>=1;i--){
downAdjust(i,N);
}
}
插入元素
从堆顶插入
void insert(int v){
heap[++n]=v;
upAdjust(1,n);
}
3.判断MaxHeap | | MinHeap | | NoHeap
int flag;
/*
MAXHEAP flag=1
MinHEAP flag=-1
NoHeap flag=0
heap的范围是从1~N
*/
if(heap[1]>heap[2]){
flag=1;
}
else{
flag=-1;
}
for(int i=1;i<=N/2;i++){
int l=2*i;
int r=l+1;
if(flag==1&&((heap[l]>heap[i])||(heap[r]>heap[i]&&r<=m))) flag=0;
if(flag==-1&&((heap[l]<heap[i])||(heap[r]<heap[i]&&r<=m))) flag=0;
}
4.堆排序
思路:每次将堆顶元素和堆底元素进行互换,之后从对顶元素开始进行向下调整。
void HeapSort(){
for(int i=N;i>1;i--){
swap(heap[i],heap[1]);
downAdjust(1,i-1);
}
}