基于堆排序

  1. function swap(nums, x, y) {
  2. var temp = nums[x];
  3. nums[x] = nums[y];
  4. nums[y] = temp;
  5. }
  6. function maxHeapify(nums, nonLeafNode, heapSize) {
  7. var left = nonLeafNode * 2 + 1;
  8. var right = nonLeafNode * 2 + 2;
  9. var largest = nonLeafNode;
  10. if (left < heapSize && nums[left] > nums[largest]) {
  11. largest = left;
  12. }
  13. if (right < heapSize && nums[right] > nums[largest]) {
  14. largest = right;
  15. }
  16. if (largest !== nonLeafNode) {
  17. swap(nums, nonLeafNode, largest);
  18. maxHeapify(nums, largest, heapSize);
  19. }
  20. }
  21. function buildMaxHeap(nums, heapSize) {
  22. for (var nonLeafNode = Math.floor(heapSize / 2) - 1; nonLeafNode >= 0; nonLeafNode--) {
  23. maxHeapify(nums, nonLeafNode, heapSize);
  24. }
  25. }
  26. function findKthLargest(nums, k) {
  27. var heapSize = nums.length;
  28. buildMaxHeap(nums, heapSize);
  29. for (var i = nums.length - 1; i >= nums.length - k + 1; i--) {
  30. swap(nums, 0, i);
  31. maxHeapify(nums, 0, --heapSize);
  32. }
  33. return nums[0];
  34. }

总结

  • 原理:堆排序
  • 时间复杂度:O(nlogn)