堆排序(大顶堆)简单版

#include
#include
#define N 101
using namespace std;
void swap(int tree[],int x,int y){
int p=tree[x];
tree[x]=tree[y];
tree[y]=p;
} //交换tree中选定的两个节点
void heapify(int tree[],int n,int i){
if (i>=n) return;
int c1=i2+1; //左子节点
int c2=i
2+2; //右子节点
int max=i;
if (c1<n && tree[c1]>tree[max])
max=c1;
if (c2<n && tree[c2]>tree[max])
max=c2;
if (max!=i){
swap(tree,max,i);
heapify(tree,n,max); //对子节点进行堆操作
}
} // 对整个完全二叉树变成堆
void build_heap(int tree[],int n){
int parent=(n-2)/2;
int i;
for (i=parent;i>=0; i–)
heapify(tree,n,i);

}//找到最后一个节点的父节点往上进行堆操作
void heap_sort(int tree[],int n){
build_heap(tree,n);
int i;
for (i = n - 1;i >= 0; i–){
swap(tree,i,0);
heapify(tree,i,0);//拿出最后一个
}
}//每次完成一个堆,把最上面和根节点互换,再斩断根节点,再次堆排。

int main(){
int tree[N],n,i;
cin>>n;
for (i=0;i<n;i++)
cin>>tree[i];
heap_sort(tree,n);
for (i=0;i<n;i++)
cout<<tree[i]<<’ ';
return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值