PushHeap
//递归
void PushHeap(vector<int>& nums,int index,int length){
int max = index;
int left = index*2+1;
int right = index*2+2;
if(left<length&&nums[left]>nums[max]){
max = left;
}
if(right<length&&nums[right]>nums[max]){
max = right;
}
if(max!=index){
swap(nums[max],nums[index]);
PushHeap(nums, max, length);
}
}
//迭代
void PushHeap(vector<int>& nums,int index,int length){
int max, left, right;
while(true){
max = index;
left = index*2+1;
right = index*2+2;
if(left<length&&nums[left]>nums[max]){
max = left;
}
if(right<length&&nums[right]>nums[max]){
max = right;
}
if(max!=index){
swap(nums[max],nums[index]);
index = max;
}else{
break;
}
}
}
BuildHeap
void BuildHeap(vector<int>& nums){
int length = nums.size();
for(int i=length/2-1;i>=0;i--){
PushHeap(nums,i,length);
}
}
HeapSort
void HeapSort(vector<int>& nums){
BuildHeap(nums);
for(int i=nums.size()-1;i>0;i--){
swap(nums[0],nums[i]);
PushHeap(nums,0,i);
}
}