6-8 Percolate Up and Down (20分)
解题思路:小顶堆之向上高速+向下调整
void PercolateUp( int p, PriorityQueue H ){ H->Elements[0]=H->Elements[p]; int i; for(i=p/2;i>0;i/=2) { if(H->Elements[0]>=H->Elements[i])break; else { H->Elements[p]=H->Elements[i]; p=i; } } H->Elements[p]=H->Elements[0]; } void PercolateDown( int p, PriorityQueue H ) { H->Elements[0]=H->Elements[p]; int i; for(i=p*2;i<=H->Size;i*=2) { if(i<H->Size&&H->Elements[i]>H->Elements[i+1]) i++; if(H->Elements[0]<=H->Elements[i])break; else { H->Elements[p]=H->Elements[i]; p=i; } } H->Elements[p]=H->Elements[0]; }
勤能补拙,熟能生巧