zoukankan      html  css  js  c++  java
  • C++ 堆排序 以及用堆排序解决topk问题

    void siftdown(vector<int>& nums, int e, int begin, int end){
        int i = begin;
        int j = 2*begin + 1;
        while(j<end){
            if(j+1 < end && nums[j+1] > nums[j]){
                j++;
            }
            if(e > nums[j]){
                break;
            }
            nums[i] = nums[j];
            i = j;
            j = 2*i + 1;
        }
        nums[i] = e;
    }
    
    void heap_sort(vector<int>& nums){
        auto end = (int)nums.size();
        for(auto k = end/2; k>=0;k--){
            siftdown(nums, nums[k], k, end);
            auto n = nums;
            int i = 0;
        }
        for(int k = end - 1;k>0;k--){
            int e = nums[k];
            nums[k] = nums[0];
            siftdown(nums, e, 0, k);
        }
    }
    
    int heap_sort_topk(vector<int>& nums, int topk){
        auto len = (int)nums.size();
        if(topk > len){
            return 0;
        }
        for ( int k = (len/2); k > 0; k-- ){
            sift_down(nums, nums[k], k, len);
        }
    
        for( int k = len -1; k > 0; k--){
            if ( topk < 0){
                return nums[0];
            }
            sift_down(nums, nums[k], 0, k);
            topk--;
        }
    }
    
    
  • 相关阅读:
    Delphi源程序格式书写规范
    ORACLE常用傻瓜问题1000问
    世界上最健康的作息时间表
    poj1657
    poj1604
    poj1654
    poj1635
    poj1655
    成为一个不折不扣的时间管理专家[推荐]
    男人的十三怕
  • 原文地址:https://www.cnblogs.com/theodoric008/p/9450034.html
Copyright © 2011-2022 走看看