Contact me:

算法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);
        }
    }
};
posted @ 2021-12-20 16:34  impwa  阅读(18)  评论(0编辑  收藏  举报