//堆排序->完全二叉树
//时间复杂度都是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;
}
堆排序(C++版)
最新推荐文章于 2022-03-14 20:35:36 发布