堆和堆排序

堆排序是一个原地排序算法,虽然在排序中用的更多的是快速排序,但堆排序有一个很常见的应用:作为高效的优先级队列。

下面我将列举跟堆排序相关的C代码,C代码主要是根据《Introduction to Algorithms》(《算法导论》)中的伪代码写的。

操作基本是围绕最大堆进行的,最小堆的情况只要进行少量改动即可

(1)堆的几个基本操作

inline int Parents(int i){return i>>1;}   //获得父结点
inline int Left(int i){return i<<1;}     //获得左子结点
inline int Right(int i){return (i<<1+1);} //获得右子结点。
(2)保持堆性质的子程序

/*保持最大堆性质*/
void MaxHeapify(int* arr,int i,int length)   
{
	int maxLable=i;
	int left=Left(i);
	int right=Right(i);
	if(right<length && arr[right]>arr[maxLable])
	{
		maxLable=right;
	}
	if(left<length && arr[left]>arr[maxLable])
	{
		maxLable=left;
	}
	if(maxLable!=i)
	{
		int temp=arr[i];
		arr[i]=arr[maxLable];
		arr[maxLable]=temp;
		MaxHeapify(arr,maxLable,length);
	}	
}


(3)建立最大堆

void BuildMaxHeap(int* arr,int length)
{
	if(length<=0 && arr==NULL)return;
	for(int i=(length-1)>>1;i>=0;i--)MaxHeapify(arr,i,length);
}

(4)堆排序

排序是升序的。

void HeapSort(int* arr,int length)
{
	if(arr==NULL && length<=0)return;
	BuildMaxHeap(arr,length);
	int heapSize=length;
	for(int i=length;i>=0;i--)
	{
		int temp=arr[i];
		arr[i]=arr[0];
		arr[0]=temp;
		heapSize--;
		MaxHeapify(arr,0,heapSize);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值