1 向下调整
总是将当前结点V与它的左右孩子比较(如果有的话),假如孩子中存在权值比结点V的权值大的,就将其中权值最大的那个孩子结点与结点V交换;交换完毕后继续让结点V和孩子比较,直到结点V的孩子的权值都比结点V的权值小或是结点V不存在孩子结点
//对heap数组在[low,high]范围进行向下调整
void downAdjust(int low,int high){
int i=low,j=i*2; //i为欲调整结点,j为其左孩子
while(j<=high){ //存在孩子结点
//如果右孩子存在,且右孩子的值大于左孩子
if(j+1<=high&&heap[j+1]>heap[j])
j=j+1; //j存储右孩子下标
//如果孩子中最大的权值比欲调整结点i大
if(heap[j]>heap[i]){
swap(heap[j],heap[i]); //交换最大权值的孩子与欲调整结点i
i=j; //保持i为欲调整结点,j为i的左孩子
j=i*2;
}else
break; //孩子的权值均比欲调整结点i小,调整结束
}
}
2 建堆
//建堆
void createHeap(){
for(int i=n/2;i>=1;i--)
downAdjust(i,n);
}
3 删除堆顶元素
//删除堆顶元素
void deleteTop(){
heap[1]=heap[n--]; //用最后一个元素覆盖堆顶元素,并让元素个数减1
downAdjust(1,n); //向下调整堆顶元素
}
4 向上调整
总是把欲调整结点与父亲结点比较,如果权值比父亲结点大,那么就交换其与父亲结点,这样反复比较,直到到达堆顶或是父亲结点的权值较大为止。
//对heap数组在[low,high]范围进行向上调整
void upAdjust(int low,int high){
int i=high,j=i/2; //i为欲调整结点,j为父亲
while(j>=low){
if(heap[j]<heap[i]){
swap(heap[j],heap[i]);
i=j;
i=i/2;
}else
break;
}
}
5 添加元素
//添加元素x
void insert(int x){
heap[++n]=x; //让元素个数加1,然后将数组末位赋值为x
upAdjust(1,n); //向上调整新加入的结点n
}
6 堆排序
//堆排序
void heapSort(){
//createHeap(); //建堆
for(int i=n;i>=1;i--){
swap(heap[i],heap[0]);
downAdjust(0,i-1);
}
}