堆排序是不稳定的排序,其时间复杂度最差、平均、最好均为O(nlogn),空间复杂度为1
对大根堆排序得到的是递增序列(常用)
对小根堆排序得到的是递减序列
♯define LeftChild(i) (2*(i)+1)
void Swap(int *p, int *q);
void PercDown(int A[], int FatherPos, int size);//堆排序功能子函数
void Heapsort(int A[], int size);//堆排序功能函数
int main(void)
{
int A[] = {9,8,7,6,5,4,3,2,1};
int i, size = sizeof(A)/sizeof(int);
Heapsort(A,size);
for(i = 0; i < size; i++)
printf("%d ",A[i]);
printf("\n");
return 0;
}
void Heapsort(int A[], int size)
{
int i;
//建大根堆
for(i = size/2; i >= 0; i--)
PercDown(A,i,size);
//堆排序
for(i = size-1; i > 0; i--)
{
Swap(&A[0], &A[i]);
PercDown(A,0,i);
}
}
void PercDown(int A[], int FatherPos, int size)
{
int Temp;
int Child;
for(Temp = A[FatherPos]; LeftChild(FatherPos) < size; FatherPos = Child)
{
Child = LeftChild(FatherPos);
if((Child != size-1) && (A[Child+1] > A[Child]))
Child++;
if(Temp < A[Child])
A[FatherPos] = A[Child];
else
break;
}
A[FatherPos] = Temp;
}
void Swap(int *p, int *q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}