zoukankan      html  css  js  c++  java
  • 算法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);
            }
        }
    };
    
  • 相关阅读:
    查看文件 ls -lh
    java Dom4j xml 写
    centos tar 常用
    os && shutil 模块
    Visual Studio
    ssh 无法登陆
    find 命令
    Centos7 安装redis
    zerorpc
    uwsgi
  • 原文地址:https://www.cnblogs.com/impw/p/15711530.html
Copyright © 2011-2022 走看看