6-8 Percolate Up and Down (20 分)
阿新 • • 發佈:2018-12-11
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
void PercolateUp( int p, PriorityQueue H ){ int i=H->Size; int X=H->Elements[p]; for (; H->Elements[i/2]>X; i/=2) { H->Elements[i]=H->Elements[i/2]; } H->Elements[i]=X; } void PercolateDown( int p, PriorityQueue H ){ int X=H->Elements[1]; int Parent,Child; for (Parent=1; Parent*2<=H->Size; Parent=Child) { Child=Parent*2; if (Child!=H->Size&&H->Elements[Child]>H->Elements[Child+1]) { Child++; } if(X<=H->Elements[Child]) break; else H->Elements[Parent]=H->Elements[Child]; } H->Elements[Parent]=X; }