堆是最大堆(其数组元素大小排序是杂乱的,数组元素之间只有堆结构关系),排序的结果为数组元素从小到大。
其原理:先把给定的数组进行建堆,建好的堆为最大堆,根元素值最大,位于数组下标0的位置上,将根元素与数组中最后一个下标的值进行对换,这样最大值就到数组的最后一个下标处。再删除最后一个下标,将剩下的元素进行堆维护,形成最大堆,如此循环往复,直到最后只剩一个元素,为最小值。
代码如下:
void Insert::HeapSort(int A[],int total)//堆排序从小到大
{
int temp=0;
for(int i=total-1;i>=1;--i)
{
temp=A[i];
A[i]=A[0];
A[0]=temp;
--total;
MaxHeapIFY(A,0,total);
}
}
因为堆维护的时间为O(lgn),再加一个循环,所以堆排序的时间复杂度为
O(nlgn).