堆排序

  /*希望你能看懂*/
  /*所谓大顶堆,就是堆顶的元素是目前所有元素的最大的哪一个  每次建立堆后就第一个   */
  /*元素和无序的最后一个元素进行交换,这样交换完了之后,整个元素就是呈现从小到大的 */
  /*顺序进行排列的    下面的程序就是以大顶堆的形式进行处理的                     */


 int heapSort(vector<int>& nums) { 
        int size = nums.size(); //构建堆的大小

        bulidheap(nums,size);   //第一次建立一个堆
        
        for(int i = nums.size() -1 ; i>=0; --i)   
        {
            //由于建堆之后第一个是单前最大的元素,所以 进行交换,使得最后一个元素变成最大的元素
            swap(nums[i] ,nums[0]);     
            --size;
            maxheapify(nums,0,size);
        }
        return nums;     
    }

    void bulidheap(vector<int> &nums,int size)
    {
        for(int j = size /2;j>=0; --j)
        {
            maxheapify(nums,j,size);
        }
    }

    void maxheapify(vector<int> &nums,int i,int size)
    {
        int left = i*2+1;
        int right = i*2+2;
        int largest = i;
        if(left < size && nums[left] > nums[largest])    //判断左边是否大于根 然后最大索引
        {
            largest = left;
        }
        if(right <size && nums[right] > nums[largest])    //判断右边是否大于根
        {
            largest = right;
        }
        if(largest != i)    //最大值的索引有变化,说明需要交换  
        {
            swap(nums[largest],nums[i]);    //将最大值和目前的堆顶进行交换
            maxheapify(nums,largest,size);
        }
    }

以留备案,仅供参考,

力扣第215题:数组中的第k个最大元素,就是利用堆排序,进行稍微处理

飞机票:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值