堆有两种:最大堆和最小堆(小根堆).在这两种堆中,结点内的数值都要满足堆特性,其细节则视堆的种类而定.在最大堆中,最大堆特性是指除了跟以外的每个结点i,有
A[parent(i)]>=A[i]
即某个结点的值至多是和其父结点的值一样大.这样,堆中的最大元素就存放在根节点中;并且,在以某个结点为根的子树中,各结点的值都不大于该子树根结点的值。
一、保持最大堆的性质的代码如下:
void maxHeapify(int *A,int size,int i){
int l=(i<<1)+1,r=l+1,largest=i;//注意:C语言中"<<"操作优先级为5,"+"加法操作的优先级为4,故表达式"i<<1+1"表示i<<(1+1)即i<<2,违背了先移位后加1的初衷!
if(l<size&&A[l]>A[i])
largest=l;
if(r<size&&A[r]>A[largest])
largest=r;
if(largest!=i){
int tem=A[i];
A[i]=A[largest];
A[largest]=tem;
maxHeapify(A,size,largest);
}
}
非递归版本代码如下:
void maxHeapify(int *A,int size,int i){
int l,r,largest;
while(i<size){
l=(i<<1)+1,r=l+1,largest=i;
if(l<size&&A[l]>A[i])
largest=l;
if(r<size&&A[r]>A[largest])
largest=r;
if(largest!=i){
int tem=A[i];
A[i]=A[largest];
A[largest]=tem;
i=largest;
}else
break;
}
}
二、建堆的代码如下:
void buildMaxHeap(int *A,int n){
for(int i=n/2-1;i>=0;i--){
maxHeapify(A,n,i);
}
}
三、堆排序的代码如下:
void heapSort(int *A,int n){
buildMaxHeap(A,n);
for(int i=n-1;i>0;i--){
int tem=A[0];
A[0]=A[i];
A[i]=tem;
maxHeapify(A,i,0);
}
}
堆排序的时间复杂度为(nlogn).