4-1 Percolate Up and Down (20分)
Write the routines to do a "percolate up" and a "percolate down" in a binary min-heap.
Format of functions:
void PercolateUp( int p, PriorityQueue H );
void PercolateDown( int p, PriorityQueue H );
where int p
is the position of the element, and PriorityQueue
is defined as the following:
typedef struct HeapStruct *PriorityQueue;
struct HeapStruct {
ElementType *Elements;
int Capacity;
int Size;
};
Sample program of judge:
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
#define MinData -1
typedef struct HeapStruct *PriorityQueue;
struct HeapStruct {
ElementType *Elements;
int Capacity;
int Size;
};
PriorityQueue Initialize( int MaxElements ); /* details omitted */
void PercolateUp( int p, PriorityQueue H );
void PercolateDown( int p, PriorityQueue H );
void Insert( ElementType X, PriorityQueue H )
{
int p = ++H->Size;
H->Elements[p] = X;
PercolateUp( p, H );
}
ElementType DeleteMin( PriorityQueue H )
{
ElementType MinElement;
MinElement = H->Elements[1];
H->Elements[1] = H->Elements[H->Size--];
PercolateDown( 1, H );
return MinElement;
}
int main()
{
int n, i, op, X;
PriorityQueue H;
scanf("%d", &n);
H = Initialize(n);
for ( i=0; i<n; i++ ) {
scanf("%d", &op);
switch( op ) {
case 1:
scanf("%d", &X);
Insert(X, H);
break;
case 0:
printf("%d ", DeleteMin(H));
break;
}
}
printf("\nInside H:");
for ( i=1; i<=H->Size; i++ )
printf(" %d", H->Elements[i]);
return 0;
}
/* Your function will be put here */
Sample Input:
9
1 10
1 5
1 2
0
1 9
1 1
1 4
0
0
Sample Output:
2 1 4
Inside H: 5 10 9
#include <stdio.h> #include <stdlib.h> typedef int ElementType; #define MinData -1 typedef struct HeapStruct *PriorityQueue; struct HeapStruct { ElementType *Elements; int Capacity; int Size; }; PriorityQueue Initialize( int MaxElements ); /* details omitted */ void PercolateUp( int p, PriorityQueue H ); void PercolateDown( int p, PriorityQueue H ); void Insert( ElementType X, PriorityQueue H ) { int p = ++H->Size; H->Elements[p] = X; PercolateUp( p, H ); } ElementType DeleteMin( PriorityQueue H ) { ElementType MinElement; MinElement = H->Elements[1]; H->Elements[1] = H->Elements[H->Size--]; PercolateDown( 1, H ); return MinElement; } int main() { int n, i, op, X; PriorityQueue H; scanf("%d", &n); H = Initialize(n); for ( i=0; i<n; i++ ) { scanf("%d", &op); switch( op ) { case 1: scanf("%d", &X); Insert(X, H); break; case 0: printf("%d ", DeleteMin(H)); break; } } printf("\nInside H:"); for ( i=1; i<=H->Size; i++ ) printf(" %d", H->Elements[i]); return 0; } /* Your function will be put here */ PriorityQueue Initialize( int MaxElements ) /* details omitted */ { PriorityQueue H; H=(struct HeapStruct *)malloc(sizeof(struct HeapStruct)); H->Elements=(int *)malloc((MaxElements+1)*sizeof(struct HeapStruct)); H->Size=0; H->Capacity=MaxElements; return H; } void PercolateUp( int p, PriorityQueue H ) { int temp,i; for(i=p; H->Elements[i] < H->Elements[i/2]; i=i/2) { temp=H->Elements[i]; H->Elements[i]=H->Elements[i/2]; H->Elements[i/2]=temp; } } void PercolateDown( int p, PriorityQueue H ) { int temp,i; for(i=p; i <= H->Size; i=i*2) { if(2*i == H->Size) { if(H->Elements[i] > H->Elements[2*i]) { temp=H->Elements[i]; H->Elements[i]=H->Elements[2*i]; H->Elements[2*i]=temp; } else { break; } } else if(2*i+1 <= H->Size) { if(H->Elements[2*i] > H->Elements[2*i+1]) { if(H->Elements[i] > H->Elements[2*i+1]) { temp=H->Elements[i]; H->Elements[i]=H->Elements[2*i+1]; H->Elements[2*i+1]=temp; } else { break; } } else { if(H->Elements[i] > H->Elements[2*i]) { temp=H->Elements[i]; H->Elements[i]=H->Elements[2*i]; H->Elements[2*i]=temp; } else { break; } } } else { break; } } }