堆排序理解
1、建立大顶堆,从最后一个非叶子节点开始。
2、具体过程:用根结点介绍(方便理解写代码):
调整根节点
观察1的动向,我们可以知道,调整一个一般非叶子节点的位置,我们需要多次重复操作。
操作一个非叶子节点的停止条件,左右子节点都比其父节点要小,或者仅有左节点且比父节点小,或者没有子节点了。
我们要从最后一个非叶子节点一直这样调整,直到根节点,结束后,我们就创建了一个大顶堆。
根节点是最大的,排序的话,将根节点拿出与最后一个节点交换位置,并给新的根节点安排位置,注意最后一个节点不要参与其中。依次进行就会得到由大到小的排序)
下面粘代码:
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
int length=nums.size();
bulidHeap(nums,length);
for(int i=0;i<k-1;i++){
int re=nums[length-1];
nums[length-1]=nums[0];
nums[0]=re;
length--;
bulidHeapTool(nums,0,length);
}
return nums[0];
}
vector<int>& bulidHeapTool(vector<int>& nums,int i,int length){
int left=2*i+1,right=2*i+2;
if(right>=length){
if(left>=length) return nums;
else if(nums[left]>nums[i]){
int re =nums[i];
nums[i]=nums[left];
nums[left]=re;
return nums;
}
else return nums;
}
int max=(nums[left]>nums[right])?left:right;
if(nums[max]<=nums[i]) return nums;
else{
int re=nums[i];
nums[i]=nums[max];
nums[max]=re;
}
return bulidHeapTool(nums,max,length);
}
vector<int>& bulidHeap(vector<int>& nums,int length)
{
int i=(length)/2-1;
for (i;i>=0;i--){
nums=bulidHeapTool(nums,i,length);
}
return nums;
}
};