##堆排序

本文介绍了堆排序的基本思想和过程,包括如何建立大堆和进行升序排列。堆排序的时间复杂度为O(N*logN),空间复杂度为1,且是不稳定的排序算法。通过示例代码展示了如何在C++中实现堆排序,并提供了在线测试链接。
摘要由CSDN通过智能技术生成
堆排 基本思想-堆排是一种选择排序,堆排通过堆来进行选择数据,如果是排升序,先把待排序元素建大堆,取出堆顶元素和最后一个元素交换,然后再调为大堆,再取堆顶元素和倒数第二个元素交换,然后继续调为大堆,直到全部待排序元素排完

堆排升序-建大堆
topK-建小堆

特性
时间复杂度N*logN
空间复杂度1
不稳定
class Solution {
public:
    void adjustdown(vector<int>&nums,int n,int root){
        int parent=root;
        int child=parent*2+1;
        while(child<n){
            //选出左右孩子中较大的那一个
            if(child+1<n&&nums[child+1]>nums[child]){
                child++;
            }
            //如果孩子比父亲大,交换,继续向下调整
            if(nums[child]>nums[parent]){
                swap(nums[child],nums[parent]);
                parent=child;
                child=parent*2+1;
            }else{
                //如果孩子小于父亲,则调整结束
                break;
            }
        }
    }
    void heapsort(vector<int>&nums){
        int n=nums.size();
        //建堆-从倒数第一个非叶子节点的子树开始调整,一直调整到根节点的树,就可以调成堆-adjustdown
        //堆排升序-建大堆
        for(int i=(n-1-1)/2;i>=0;i--){
            adjustdown(nums,n,i);
        }
        //交换调堆迭代
        for(int end=n-1;end>=0;end--){
            //交换-把当前最大的数交换到最后面
            swap(nums[0],nums[end]);
            //调堆-找出当前数当中最大的
            adjustdown(nums,end,0);
        }
    }
    vector<int> sortArray(vector<int>& nums) {
        heapsort(nums);
        return nums;
    }
};

测试用例- [6,1,2,7,9,3,4,5,10,8]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值