堆&优先级队列的实现

堆排序算法:根据堆具有的性质,我们可以每次将堆顶的数字(也就是最大或者最小的数字)与对数组尾部的数字交换,然后将堆从树的根部开始向下调整,到已经交换的数字的前一个位置截至,那么这样交换以后后边的数字就是有序的了!

void HeapSort(int* a,size_t size)
{
	//建堆
	for (int i=(size-1)/2; i>=0; --i)
	{
		_AdjustDown(a,i,size);
	}
	
	//排序
	int index = size-1;
	for (int i=0; i<size; ++i)
	{
		swap(a[0],a[index]);	//交换堆顶与最后一个数-------将最大(小)的数据排到最后
		_AdjustDown(a,0,index);	//从堆顶开始重新向下调整
		--index;
	}
	for (size_t j=0; j<size; ++j)
	{
		cout<<a[j]<<" ";
	}
	cout<<endl;
}
void _AdjustDown(int* a,int root,int size)	//向下调整
{
	int parent = root;
	int child = parent * 2 + 1;
	while (child < size)
	{
		if ((child+1) < size
			&& a[child+1] > a[child])	//当右子树存在并且右子树大于左子树
		{
			++child;
		}
		if (a[child] > a[parent])
		{
			swap(a[child],a[parent]);
			parent = child;
			child = 2*parent +1;
		}
		else
			break;
	}
}




本文转载:CSDN博客