通俗理解:運用數據結構中的最大堆結構,取出數組中的中的最大元素,在重新構造最大堆,再找出其最大元素,以此類推直到取完堆結構中的元素爲止,最終得到排好序的數組。觀看動態過程
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);
}
}
堆排序的平均時間複雜度爲