递归式建堆voidswap(int*a,int*b){inttemp*a;*a*b;*btemp;}voidmaxHeapify(int*a,inti,intheapSize){intli*21;intri*22;intlargesti;if(lheapSizea[l]a[largest]){largestl;}if(rheapSizea[r]a[largest]){largestr;}if(largest!i){swap(a[i],a[largest]);maxHeapify(a,largest,heapSize);}}voidbuildMaxHeap(int*a,intheapSize){for(intiheapSize/2-1;i0;--i){maxHeapify(a,i,heapSize);}}迭代式建堆#includestdio.hvoidswap(int*a,int*b){inttemp*a;*a*b;*btemp;}voiddown(int*nums,intsize,inti){for(intk2*i1;ksize;k2*k1){/* 父节点 (k - 1) / 2左子节点 k右子节点 k 1 */printf_s(*************************************************************\r\n);printf_s(父节点i %d, 左子节点k %d, 右子节点k 1 %d\r\n,i,k,k1);// 取左右子节点中较大的那一个if(k1sizenums[k]nums[k1]){printf_s(nums[%d] nums[%d] %d %d k\r\n,k,k1,nums[k],nums[k1]);k;}if(nums[k]nums[(k-1)/2]){printf_s(nums[%d] nums[%d] %d %d break\r\n,k,(k-1)/2,nums[k],nums[(k-1)/2]);printf_s(*************************************************************\r\n);break;}printf_s(nums[%d] nums[%d] %d %d swap\r\n,k,(k-1)/2,nums[k],nums[(k-1)/2]);swap(nums[k],nums[(k-1)/2]);for(intj0;jsize;j){printf(%d ,nums[j]);}printf_s(\r\n);for(intj0;jsize;j){printf(%d ,j);}printf_s(\r\n*************************************************************\r\n);}}voidInit(int*nums,intsize){for(intisize/2-1;i0;i--){down(nums,size,i);}}intPop(int*nums,intsize){swap(nums[0],nums[size-1]);down(nums,size-1,0);returnnums[size-1];}voidPush(int*nums,intsize,intx){nums[size]x;// 子节点大于父节点的值交换值for(intisize;i0nums[(i-1)/2]nums[i];i(i-1)/2){swap(nums[(i-1)/2],nums[i]);}}voiditerator(int*nums,intsize){for(inti0;isize;i){printf(%d ,nums[i]);}printf(\n);}intmain(){intarr[]{1,2,3,4,5,6,7,8,9};intnsizeof(arr)/sizeof(arr[0]);Init(arr,n);printf(Max Heap:\n);iterator(arr,n);Push(arr,n-1,10);iterator(arr,n);Pop(arr,n);iterator(arr,n);return0;}运行结果外部参考Leetcode2558. 从数量最多的堆取走礼物Leetcode215. 数组中的第K个最大元素