直接上代码
原理见:堆排序(递归方法)
class Solution {
public:
void heapAdjust(vector<int>& nums, int idx,int len){
int temp=nums[idx];
for(int j=idx*2+1;j<len;j=j*2+1){ //j初始化为左子节点
if(j+1<len&&nums[j]<nums[j+1]) {j++;} //把j更新为左右子树中较大值的索引
//当前父节点值应已经换为temp不是nums[idx],idx存的是上一步循环的子节点中较大值
if(temp>nums[j]) {break;}
nums[idx]=nums[j]; //上一步没断开说明idx小于j,把j赋值给idx
idx =j; //把idx更新为j,因为j已经赋值给idx了,说明待排序结点temp暂放在新的idx里面,这两部相当于交换idx与j的值
}
//遍历完后,idx即为调整的最终位置,把待排序temp放入idx中
nums[idx]=temp;
}
void heapSort(vector<int>& nums, int n,int k){
for(int i=n/2-1;i>=0;i--) //建堆,因为索引从0计算,则i从n/2-1计算
{
heapAdjust(nums, i,n);
}
for(int i=n-1;i>0;i--)
{
if(k) {k--;}
else {break;} //找到第k个,断开
swap(nums[0],nums[i]);
heapAdjust(nums,0,i); //调整剩下的0到i-1共i个数,此时长度为i
}
}
int findKthLargest(vector<int>& nums, int k) {
//堆排序
int n = nums.size();
heapSort(nums, n,k);
return nums[n-k];
}
};