代码:主要针对王道的代码增加了新元素的插入(上浮)操作
#include<iostream>
#include<algorithm>
using namespace std;
typedef int ElemType;
void HeapAdjust(ElemType A[],int k,int len){
int i;
A[0]=A[k];
for(i=2*k;i<=len;i*=2){
if(i<len&&A[i]<A[i+1])
i++;
if(A[0]>=A[i]) break;
else{
A[k]=A[i];
k=i;
}
}
A[k]=A[0];
}
void Heapadjust(ElemType A[],int k){
int i;
A[0]=A[k];
for(i=k/2;i>0;i/=2){
if(i<=0 || A[i]>=A[0]) break;
else{
A[k]=A[i];
k=i;
}
}
A[k]=A[0];
}
void BuildMaxHeap(ElemType A[],int len){
for(int i=len/2;i>0;i--) HeapAdjust(A,i,len);
}
void HeapSort(ElemType A[],int len){
int j;
BuildMaxHeap(A,len);
for(j=len;j>1;j--){
swap(A[j],A[1]);
HeapAdjust(A,1,j-1);
}
}
void HeapInsert(ElemType A[],int e,int len){
A[++len]=e;
Heapadjust(A,len);
}
void printArray(ElemType A[],int n){
for(int i=1;i<=n;i++){
printf("%d ",A[i]);
}
printf("\n");
}
测试1(对大(小)根堆插入(上浮)一个新元素)时间复杂度与树的高度h有关,根据完全二叉树的性质:O(
l
o
g
2
n
log_2^{n}
log2n)
int main(){
int A[11]={0,2,3,4,1,2,4,5,8,6,14};
printArray(A,10);
BuildMaxHeap(A,10);
printArray(A,10);
HeapInsert(A,7,10);
printArray(A,11);
return 0;
}
测试2(堆排序)-时间复杂度
O
(
n
)
+
O
(
n
l
o
g
2
n
)
=
O
(
n
)
O(n)+O(nlog_2^{n})=O(n)
O(n)+O(nlog2n)=O(n)
int main(){
int A[11]={0,2,3,4,1,2,4,5,8,6,14};
printArray(A,10);
HeapSort(A,10);
printArray(A,10);
return 0;
}