数组第k大的元素

一、数组第k大的元素

思路:1.快排
    2.大顶堆(手撕堆)

 //手撕堆排
 class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {  //手撸大根堆
       
       for(int i=nums.size()/2-1;i>=0;i--){  //第一次从nums.size()/2-1开始调整初始化原始大顶堆
           adjust(nums,nums.size(),i);
       }
       for(int i=nums.size()-1;i>nums.size()-k;i--){    //后续从末尾开始交换堆顶和堆尾元素。
            swap(nums[0],nums[i]);
            adjust(nums,i,0);
       }
       return nums[0];
    }
    void adjust(vector<int>& nums,int len,int root){   //核心就是堆调整函数
          int child_left=2*root+1;
          int child_right=2*root+2;
          int Max=root;
          if(child_left<len && nums[child_left]>nums[Max]) Max=child_left;
          if(child_right<len && nums[child_right]>nums[Max]) Max=child_right;
          if(Max==root) return;
          swap(nums[root],nums[Max]);
          adjust(nums,len,Max);
     }

};
//快排
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {  //快排
       return quick_sort(nums,k,0,nums.size()-1);

    }
    int quick_sort(vector<int>& nums, int k,int l,int r){
          int left=l,right=r;
          while(left<right){
              while(left<right && nums[right]>=nums[l])  right--;
              while(left<right && nums[left]<=nums[l])  left++;
              swap(nums[left],nums[right]);
          }
          swap(nums[left],nums[l]);
          if(nums.size()-left>k) return quick_sort(nums,k,left+1,r);
          if(nums.size()-left<k)  return quick_sort(nums,k,l,left-1);
          else return nums[left]; 
    }
  
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值