通俗理解:运用数据结构中的最大堆结构,取出数组中的中的最大元素,在重新构造最大堆,再找出其最大元素,以此类推直到取完堆结构中的元素为止,最终得到排好序的数组。观看动态过程
void
swap(int* a,int *b)
{
int swap;
swap = *a;
*a = *b;
*b = swap;
}
//创建最大堆
void
build_heap(int *a,int size)
{
int k;
for (k = size;k>=0;k--)
heapfiy(a,size,k);
}
//保持最大堆性质
void
heapfiy(int *a,int size,int n)
{
int left = 2*n+1;
int right = 2*n+2;
int max = n;
if (left<=size && a[n] < a[left])
max = left;
if (right<=size && a[max] < a[right])
max = right;
if (max!=n)//此处检查小分支上的元素是否发生变化,若变化继续调用heapfiy()
{
swap(&a[max],&a[n]);
heapfiy(a,size,max);
}
}
//堆排序实现
void
heapsort(int*a,int size)
{
build_heap(a,size);
while (size>0)
{
swap(&a[0],&a[size--]);
heapfiy(a,size,0);
}
}
堆排序的平均时间复杂度 为