堆排序有大根堆和小根堆,这里只介绍大根堆
以下是其C语言代码:
首先是调整堆的元素:
void HeadAdjust(int A[], int k, int len)
{
int i;
A[0] = A[k]; //A[0]为临时空间,相当于“哨兵”
for(i = 2*k; i < len; i*= 2) //i = 2*k的意思是访问子树,i *= 2的意思是访问当前节点的左右孩子
{
if(i<len && A[i] < A[i+1]) //比较左右孩子的大小
++i;
if(A[0] >= A[i])
break;
A[k] = A[i];
k = i;
}
A[k] = A[0];
}
下面的算法才是堆排序算法:
void HeapSort(int A[],int len)
{
int i,temp;
for(i = len/2; i > 0; i--)
{
HeadAdjust(A,i,len); //反复调整堆
}
for(i = len; i > 1; i--)
{
temp = A[i];
A[i] = A[1];
A[1] = temp;
HeadAdjust(A,1,i-1); //此时最后一个元素已经是最大,接着对除此元素外的前面所有的元素继续排序,直到序列有序为止;
}
}
时间复杂度在最好和最坏情况下均为O(n*log2 n),空间复杂度为O(1);