//对heap数组[low,high]范围进行向下调整//low为欲调整结点下标,high一般为堆最后一个元素下标voiddownAdjust(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 = j;
j = i *2;}else{break;//孩子中权值均比欲调整结点i小,调整结束}}}
2.1.3 创建堆
//创建堆voidcreateHeap(){//序列元素个数为n的非叶子结点为[1,n/2],n/2向下取整//倒着枚举是因为,每次调整完一个结点后,当前子树中权值最大的结点就会处在根结点的位置for(int i = n /2; i >=1;--i){downAdjust(i, n);}//结点按层序存储在数组中}