排序算法之堆排序

76 阅读1分钟

建议看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;
}