欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

利用大顶堆进行堆排序找出数组的第K个最大元素-LeetCode模拟问题

最编程 2024-08-14 20:40:17
...
// 通过大顶堆求解问题 var findKthLargest = function(nums, k) { // 堆的大小 let heapSize = nums.length; // 调用大顶堆函数 buildMaxHeap(nums,heapSize); // 要想求第K大的元素,就需要将大顶堆下沉K-1次,每下沉一次进行一次重新的堆化; for (let i = 0; i < k - 1; i++ ) { swap(nums,0,nums.length - 1 - i); // 将最后一个元素忽略,不参与堆化 nums heapSize--; // 从第0个元素开始继续进行堆化 maxHeapify(nums,0,heapSize); } // 此时堆顶就是第K个最大元素 return nums[0] // 构建大顶堆 function buildMaxHeap(nums,heapSize) { for (let i = Math.floor(heapSize / 2) - 1; i >= 0; i--) { maxHeapify(nums,i,heapSize) } } function maxHeapify(nums,i,heapSize) { // 首先假定第i个是最大的 let max = i; let leftChild = 2 * i + 1; let rightChild = 2 * i + 2; // 如果下标不越界(即子孩子存在),并且子节点小于第i个元素 if (leftChild < heapSize && nums[leftChild] > nums[max]) { max = leftChild; } if (rightChild < heapSize && nums[rightChild] > nums[max]) { max = rightChild; } // 判断是否发生了交换 if (max !== i) { swap(nums,i,max); // 交换之后,从下面上来的元素的位置后面需要继续进行堆化 maxHeapify(nums,max,heapSize); } } function swap (nums,i,j) { let temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } }; findKthLargest([8,5,0,3,7,1,2], 3) 复制代码