【kuandui】二叉堆

来源:互联网 发布:网络基础知识ppt 编辑:程序博客网 时间:2024/06/05 02:10
    恩,虽然二叉堆编的我头疼,但......所以我还是决定讲少点。
    二叉堆是什么呢?其实就是一个数组......以前我们学过胜者树,这东西和胜者树差不多,只是少了最下面一层,然后求最大最小值时用交换罢了。
就像:【kuandui】二叉堆 - 李kuandui - 神殇KD灬度阡陌

    好吧我承认画工捉急,能看懂就行。就是这样的。
    
    那么我们如何取出一个值呢?
    我们可以把要取出的这个值与最后一个值交换,然后维护一下二叉堆!
    such so easy!

【实例】
二叉堆排序。

【例程】

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

int n,k;
int num[1000000];

void heapup(int m)
{
int tmp=num[m];
int j=(m-1)/2;
while(j>=0&&m!=0)
{
if(num[j]<=tmp)
break;
num[m]=num[j];
m=j;
j=(m-1)/2;
}
num[m]=tmp;
}

void heapadd(int n,int shu)
{
num[n]=shu;
heapup(n);
}

//=========以上是插入==========//

void heapdown(int m,int lon)
{
int tmp=num[m];
int j=2*m+1;
while(j<lon)
{
if(j+1<lon&&num[j+1]<num[j])
++j;
if(num[j]>=tmp)
break;
num[m]=num[j];
m=j;
j=2*m+1;
}
num[m]=tmp;
}

//==========以上是删除==========//

void buildheap(int n)
{
for(int i=n/2-1;i>=0;--i)
heapdown(i,n);
}

void heapsort()
{
buildheap(n);
for(int i=n-1;i>=1;--i)
{
swap(num[0],num[i]);
heapdown(0,i-1);
}
}

//==========以上是排序========//

int main()
{
cin>>n;
for(int i=0;i<n;++i)
{
int shu;
cin>>shu;
heapadd(i,shu);
}

heapsort();

for(int i=0;i<n;++i)
cout<<num[i]<<" ";
return 0;
}


0 0
原创粉丝点击