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