时间复杂度为O(nlgn)
#include "stdafx.h"
#include "stdlib.h"
//数组中堆元素的个数
int heap_size;
//数组元素个数
int length;
//添加一个根结点,并维护堆的性质
void MAX_HEAPIFY(int *A,int i)
{
//左、右孩子都已是最大堆
int left=2*i+1;
int right=2*(i+1);
int largest;
//由于数组下标从0开始,所以此处应与heap_size-1比较
if(left<=heap_size-1&&A[left]>A[i])
{
largest=left;
}
else
{
largest=i;
}
if(right<=heap_size-1&&A[right]>A[largest])
{
largest=right;
}
//如果largest等于i说明已满足堆的性质
if(largest!=i)
{
//将最大的值赋值给根结点
int temp=A[i];
A[i]=A[largest];
A[largest]=temp;
MAX_HEAPIFY(A,largest);
}
}
//建立一个最大堆
void BUILD_MAX_HEAP(int *A)
{
//叶子结点已满足堆的性质
for(int i=length/2;i>0;--i)
{
//数组里的元素从下往上添加进堆里
MAX_HEAPIFY(A,i-1);
}
}
//堆排序
void HEAP_SORT(int *A)
{
int temp;
BUILD_MAX_HEAP(A);
for(int i=length-1;i>0;--i)
{
//最大的元素总是存储在根结点中,将根结点的值与堆里最后一个元素的值交换
temp=A[0];
A[0]=A[i];
A[i]=temp;
//将A[i]分离出堆
heap_size=heap_size-1;
//A[0]的孩子结点仍然是最大堆,只需将新的A[0]添加进堆里
MAX_HEAPIFY(A,0);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int A[]={5,13,2,25,7,17,20,8,4};
heap_size=length=sizeof(A)/sizeof(A[0]);
HEAP_SORT(A);
for(int i=0;i<length;++i)
{
printf("%d ",A[i]);
}
printf("\n");
system("pause");
return 0;
}
算法导论-----堆排序
最新推荐文章于 2023-04-27 23:37:22 发布