堆的实现
堆分为大顶堆和小顶堆
其操作:
(1)插入时,插入在最后,然后向上调整
(2)删除时,将最后一个元素调至到堆顶,然后向下调整
(3)堆的生成分两种:
①插入后再调整 ——-时间复杂度O(NlogN)
②先排成完全二叉树再调整 ——-时间复杂度O(N)
这两者区别,有时拍完后的二叉树不一定一样注意
这不能直接用下面的代码,否则最后一个测试点过不去,超时!
因为malloc,直接设为数组即可,还有就是用Insert,不能用BuileHeap,因为其和调整完和测试用例不符
下面是大顶堆,小顶堆改下< 和 minSize
#include<stdio.h>
#include<stdlib.h>
#define ElementType int
typedef struct HNode *Heap;
struct HNode {
ElementType *Data;
int Size;
int Capacity;
};
typedef Heap MaxHeap;
typedef Heap MinHeap;
#define MAXDATA 1000
MaxHeap CreateHeap( int MaxSize )
{
MaxHeap H = (MaxHeap)malloc(sizeof(struct HNode));
H->Data = (ElementType *)malloc((MaxSize+1)*sizeof(ElementType));
H->Size = 0;
H->Capacity = MaxSize;
H->Data[0] = MAXDATA;
return H;
}
bool IsFull( MaxHeap H )
{
return (H->Size == H->Capacity);
}
bool Insert( MaxHeap H, ElementType X )
{
int i;
if ( IsFull(H) ) {
printf("最大堆已满");
return false;
}
i = ++H->Size;
for ( ; H->Data[i/2] < X; i/=2 )
H->Data[i] = H->Data[i/2];
H->Data[i] = X;
return true;
}
#define ERROR -1
bool IsEmpty( MaxHeap H )
{
return (H->Size == 0);
}
ElementType DeleteMax( MaxHeap H )
{
int Parent, Child;
ElementType MaxItem, X;
if ( IsEmpty(H) ) {
printf("最大堆已为空");
return ERROR;
}
MaxItem = H->Data[1];
X = H->Data[H->Size--];
for( Parent=1; Parent*2<=H->Size; Parent=Child ) {
Child = Parent * 2;
if( (Child!=H->Size) && (H->Data[Child]<H->Data[Child+1]) )
Child++;
if( X >= H->Data[Child] ) break;
else
H->Data[Parent] = H->Data[Child];
}
H->Data[Parent] = X;
return MaxItem;
}
void PercDown( MaxHeap H, int p )
{
int Parent, Child;
ElementType X;
X = H->Data[p];
for( Parent=p; Parent*2<=H->Size; Parent=Child ) {
Child = Parent * 2;
if( (Child!=H->Size) && (H->Data[Child]<H->Data[Child+1]) )
Child++;
if( X >= H->Data[Child] ) break;
else
H->Data[Parent] = H->Data[Child];
}
H->Data[Parent] = X;
}
void BuildHeap( MaxHeap H )
{
int i;
for( i = H->Size/2; i>0; i-- )
PercDown( H, i );
}
int main(){
int N, M;
int i;
int temp;
MaxHeap maxHeap;
scanf("%d %d\n", &N, &M);
maxHeap = CreateHeap(N);
for(i = 1; i <= N; ++i){
scanf("%d", &temp);
maxHeap -> Data[i] = temp;
}
for(i = 1; i <= N; ++i){
printf("%d ", maxHeap -> Data[i]);
}
printf("\n");
BuildHeap(maxHeap);
for(i = 1; i <= N; ++i){
printf("%d ", maxHeap -> Data[i]);
}
printf("\n");
return 0;
}