jzoj1478-堆排序【堆】
生活随笔
收集整理的這篇文章主要介紹了
jzoj1478-堆排序【堆】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
一些數,用堆把它們從小到大排好
解題思路
每個堆的開頭是最大(小)的。每次把開頭讀取出來,然后把a[num]提取上來,然后num減1在把新的a[1]降到合適的位置。
代碼
#include<cstdio> using namespace std; int a[200001],num,x,n; long long s,u; void up(int x)//調整位置之1 {int t;while (x>1 && a[x]<a[x/2]){t=a[x];a[x]=a[x/2];a[x/2]=t;x/=2;} } void down(int x)//調整位置之2 {int t,y;while (x*2<=num && a[x]>a[x*2] || x*2+1<=num && a[x]>a[x*2+1]){y=x*2;if (x*2+1<=num && a[x*2]>a[x*2+1]) y++;t=a[x];a[x]=a[y];a[y]=t;x=y;} } void insert(int x)//插入 {a[++num]=x;up(num);} int main() {scanf("%d",&n); for (int i=1;i<=n;i++){scanf("%d",&x);insert(x);}//建堆for (int i=1;i<=n;i++){printf("%d\n",a[1]);a[1]=a[num];num--;down(1);//排序} }總結
以上是生活随笔為你收集整理的jzoj1478-堆排序【堆】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【jzoj3734,Usaco2014O
- 下一篇: 关于勇气或成功的名言 关于勇气或成功的名