您的位置:首页 > 其它

堆排序算法

2016-10-14 18:08 253 查看
附:堆&优先级队列的实现

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



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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  堆排序