算法34 堆排序heapsort
第一次写成了O(n^2)
没搞懂初始化构建大顶堆有什么用,就每次都从下往上比较然后生成大顶堆;
要让复杂度降到nlog(n)得利用堆的性质呀,从上往下比较才能是logn
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
HpRk(nums);
return nums;
}
void Father2son(vector<int>& nums,int i,int n){//父结点与子结点比较
int max;
while(2*i+1<=n){
2*i+2<=n&&nums[2*i+1]<nums[2*i+2]?max=2*i+2:max=2*i+1;//判断越界、比较子节点大小
if(max<=n&&nums[max]>nums[i]){
swap(nums[max],nums[i]);
i=max;
}
else break;
}
}
void Bottom_Up(vector<int>& nums,int n){//构建大顶堆
for(int i=n/2;i>=0;i--){
Father2son(nums,i,n);
}
}
void HpRk(vector<int>& nums){
int n=nums.size()-1;
Bottom_Up(nums,n);
for(int i=n;i>0;){
swap(nums[i],nums[0]);
Father2son(nums,0,--i);
}
}
};