建议看acwing视频
构建最小堆
构建最小堆
function buildMinheap(arr,heapsize){
for(let i=Math.floor(heapsize/2);i>=1;i--){
down(arr,i,heapsize)
}
}
function down(arr,i,heapsize){
let l=i*2,
r=i*2+1,
min=i;
if(l<=heapsize && arr[l]<arr[min])
min=l;
if(r<=heapsize && arr[r]<arr[min])
min=r;
if(min != i){
swap(arr,min,i)
down(arr,min,heapsize)
}
}
function swap(arr,l,r){
let temp =arr[l];
arr[l]=arr[r];
arr[r]=temp;
}
构建最大堆类似, 如下力扣215题 215. 数组中的第 K 个最大元素
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var findKthLargest = function(nums, k) {
debugger;
let heapsize = nums.length,
arr=[0,...nums];
buildmaxheap(arr,heapsize)
for(let i=arr.length-1;i>=arr.length-k+1;--i){
swap(arr,1,i)
heapsize--;
maxHeapify(arr,1,heapsize)
}
return arr[1]
};
function buildmaxheap(a,heapsize){
for(let i=Math.floor(heapsize/2);i>=1;--i){
maxHeapify(a,i,heapsize)
}
}
function maxHeapify(a,i,heapsize){
let l=i*2,r=i*2+1,largest=i;
if(l<=heapsize && a[l]>a[largest])
largest=l;
if(r<=heapsize && a[r]>a[largest])
largest=r;
if(largest!=i){
swap(a,i,largest)
maxHeapify(a,largest,heapsize);
}
}
function swap(a,i,j){
let temp = a[i];
a[i]=a[j];
a[j]=temp;
}