void Down_Heapify( vector<int> & data, unsigned int i )
{
unsigned int left = left_child( i );
unsigned int right = right_child( i );
bool hasleft = left < data.size();
bool hasright = right < data.size();
// data[i] is a leaf
if( !hasleft && !hasright )
return;
// heap property is satisfied
// left child is greater than parent and right child is greater than
// parent if it exists
if( hasleft && data[i] <= data[ left ]
&& ( ( hasright && data[i] <= data[ right ] )
|| !hasright ) )
return;
// Otherwise, swap data[i] and the smaller of its children.
unsigned int smaller;
if( hasright && data[ right ] <= data[ left ] )
smaller = right;
else
smaller = left;
swap( data, i, smaller );
// Start again on the child that changed (i.e., move data[i] down).
Down_Heapify( data, smaller );
}
Look at node i (initially the root).
We know that the only node that may violate the heap property is a child of the new i. (Why?)
Kind of like bubblesort or insertion sort in a tree. The root value trickles down until it stops.
Running Time? (Maximum number of comparisons and swaps.)