算法导论-----堆排序

时间复杂度为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;
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值