堆排序(C++迭代法实现)

直接上代码
原理见:堆排序(递归方法)

class Solution {
public:
    void heapAdjust(vector<int>& nums, int idx,int len){
        int temp=nums[idx];
        for(int j=idx*2+1;j<len;j=j*2+1){           //j初始化为左子节点
            if(j+1<len&&nums[j]<nums[j+1])  {j++;}  //把j更新为左右子树中较大值的索引
            //当前父节点值应已经换为temp不是nums[idx],idx存的是上一步循环的子节点中较大值
            if(temp>nums[j])  {break;}        
            nums[idx]=nums[j];               //上一步没断开说明idx小于j,把j赋值给idx
            idx =j;                         //把idx更新为j,因为j已经赋值给idx了,说明待排序结点temp暂放在新的idx里面,这两部相当于交换idx与j的值     
        }
        //遍历完后,idx即为调整的最终位置,把待排序temp放入idx中
        nums[idx]=temp; 

    }
    void heapSort(vector<int>& nums, int n,int k){
        for(int i=n/2-1;i>=0;i--)   //建堆,因为索引从0计算,则i从n/2-1计算
        {
            heapAdjust(nums, i,n);
        }
        for(int i=n-1;i>0;i--)
        {
            if(k)   {k--;}
            else {break;}             //找到第k个,断开
            swap(nums[0],nums[i]);
            heapAdjust(nums,0,i);     //调整剩下的0到i-1共i个数,此时长度为i
        }
    }
    int findKthLargest(vector<int>& nums, int k) {
        //堆排序
        int n = nums.size();
        heapSort(nums, n,k);
        return nums[n-k];
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值