堆排序(C++版)

//堆排序->完全二叉树
//时间复杂度都是nlogn 空间复杂度是O(n)

#include <iostream>
#include <vector>
using namespace std;

void print(vector<int>& nums){
    for(auto a: nums){
        cout<<a<<" ";
    }
    cout<<endl;
}

//对每个节点做heapify操作
void heapify(vector<int>& nums,int n,int i){
    int c1=2*i+1;//求当前节点的左孩子下标
    int c2=2*i+2;//求当前节点的右孩子下标
    int max=i;//先假设当前节点是最大值
    //因为做heapify操作要保证左右孩子节点下标要在正确范围内
    if(c1<n&&nums[c1]>nums[max]){
        max=c1;
    }
    if(c2<n&&nums[c2]>nums[max]){
        max=c2;
    }
    if(max!=i){
        swap(nums[max],nums[i]);
        heapify(nums,n,max);
    }
}

//对完全二叉树的每个节点做heapify操作,从而建立起大根堆
//从最后一个节点的父节点开始,最后一个节点的下标n-1。
void heapify_build(vector<int>& nums,int n){
    for(int ii=(n-1)/2;ii>=0;ii--){
        heapify(nums,n,ii);
    }
}
void heapify_sort(vector<int>& nums){
    int n=nums.size();
    heapify_build(nums,n);//首先建立大根堆
    for(int ii=0;ii<n;ii++){
        swap(nums[0],nums[n-ii-1]);//每次交换最后一个节点和根节点。
        heapify(nums,n-ii-1,0);//对交换后的节点继续进行heapify。注意n变为n-1,动态递减需要变量ii来控制
    }
}


int main(){
     //vector<int> nums{1,24,67,23,4,78,90,456};
      vector<int> nums{1,3,2,58,5,6,43,54,65,55,55,55};
     heapify_sort(nums);
     print(nums);
     return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值