您的位置:首页 > 其它

算法导论_堆排序

2014-12-08 21:00 169 查看
先是根据算法导论堆排序伪代码写的代码:

#include<cstdio>
#define lson (i<<1)
#define rson (i<<1|1)
const int N=60;
void SWAP(int &a,int &b) {int t=a;a=b;b=t;}
void max_heapify(int A[],int i,int asize)
{
int largest;
//从parent,ron,lson中选出最大的并赋给parent结点
if(lson<=asize&&A[lson]>A[i])
largest=lson;
else largest=i;
if(rson<=asize&&A[rson]>A[largest])
largest=rson;
if(largest!=i)
{
SWAP(A[i],A[largest]);
max_heapify(A,largest,asize);
}

}
void build_max_heap(int A[],int asize)
{
for(int i=asize>>1;i>=1;i--)
max_heapify(A,i,asize);
}
void heapsort(int A[],int asize)
{
build_max_heap(A,asize);
//循环中,每次把根节点的值与最后面的点的值交换,并移除交换后的最后那个结点,直到只剩下1个点,循环结束
for(int i=asize;i>=2;i--)
{
SWAP(A[1],A[i]);
--asize;
max_heapify(A,1,asize);//asize 每循环一次减一,作用相当于移除最后那个结点
}
}
int main()
{
int A[N+10];
for(int i=1;i<=N;i++)
scanf("%d",&A[i]);
heapsort(A,N);
for(int i=1;i<=N;i++)
printf("%d\n",A[i]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: