堆排序

来源:互联网 发布:2007-2008网络流行歌曲 编辑:程序博客网 时间:2024/06/08 00:40

铺垫一下:

首先聊下什么是“堆”,堆其实是一个“完全二叉树”,而且是一个有特殊规则的完全二叉树,可以分为“大顶堆”和“小顶堆”,大顶堆特点是根节点比其左右节点都要大,而小顶堆与其相反。


思路:

首先建立最大堆,然后依次交换根节点与最后一个元素,依次删除最后一个元素,重新建立最大堆。

注意:根节点是从0开始计数。

void swap(int *a,int *b){int t=*a;*a=*b;*b=t;}void PercDown(int A[],int p,int N){//将N个结点以p为根节点的堆调整为最大堆;//此时堆根节点从0开始计数;int parent,child;int X;X=A[p];for(parent=p;(parent*2+1)<N;parent=child){child=parent*2+1;if((child!=N-1)&&A[child]<A[child+1])child++;if(X>=A[child]) break;elseA[parent]=A[child];}A[parent]=X;}void Heap_sort(int A[],int N){int i;for(i=N/2-1;i>=0;i--)PercDown(A,i,N);for(i=N-1;i>=0;i--){swap(&A[0],&A[i]);PercDown(A,0,i);}}


原创粉丝点击