模板-堆(根堆相关操作,堆排)

堆排时从小到大是pus_small&del_stob;从大到小是pus_big&del_btos

pus函数操作基本原理是把当前点与之上的点比对,有不符合规律的交换;

del函数操作基本原理是删去堆顶的点,把最后一个节点放到堆顶进行交换比对操作,若把删去的堆顶存下来的话就是排序


#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;


int n,siz;int x;int p,q;
int a[maxn];int hp[maxn];
void pus_small(int x);
void pus_big(int x);
int del_stob();
int del_btos();

int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
//		pus_small(x);
		pus_big(x);
	}
	for(int i=1;i<=n;i++){//堆排及输出 
//		p=del_stob();
		p=del_btos();
		printf("%d",p);
	}						
//	for(int i=1;i<=n;i++){//建堆输出 
//		printf("%d",hp[i]);
//	}


//	cout<<hp[1]<<endl;//堆顶输出 
	return 0;
}

void pus_small(int x){//小根堆 
	siz++;
	hp[siz]=x;
	int now=siz;
	while(now>1){
		if(hp[now]<hp[now/2]){
			swap(hp[now],hp[now/2]);
			now/=2;
		}//if
		else break;
	}//while
}//void

void pus_big(int x){//大根堆 
	siz++;
	hp[siz]=x;
	int now=siz;
	while(now>1){
		if(hp[now]>hp[now/2]){
			swap(hp[now],hp[now/2]);
			now/=2;
		}//if
		else break;
	}//while
}//void

int del_stob()//小到大排序 
{
	int res=hp[1];
	hp[1]=hp[siz];siz--;
	int now=1;
	while(2*now<=siz)
	{
		int tp=2*now;
		if(tp<siz && hp[tp]>hp[tp+1]) tp=tp+1;//如果左节点<总节点,说明有右节点 //>
		if(hp[now]>hp[tp])//>
		{
			swap(hp[now],hp[tp]);
			now=tp;
		}
		else break;//当前节点比孩子都小,提前结束 
	} 
	return res; 
}

int del_btos()//大到小排序 
{
	int res=hp[1];
	hp[1]=hp[siz];siz--;
	int now=1;
	while(2*now<=siz)
	{
		int tp=2*now;
		if(tp<siz && hp[tp]<hp[tp+1]) tp=tp+1;//如果左节点<总节点,说明有右节点 //< 
		if(hp[now]<hp[tp])//<
		{
			swap(hp[now],hp[tp]);
			now=tp;
		}
		else break;//当前节点比孩子都小,提前结束 
	} 
	return res; 
}

//好玄学的说




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值