/* Do not remove the headers from this file! see /USAGE for more info. */
// Belboz (rust@virginia.edu)
// Oct 18, 1994
private mixed list = ({ 0, });
private int size = 0;
private function rule = (: $1 > $2 :);
void sort_in(int);
void
set_rule( function r )
{
if( functionp(r) )
{
rule = r;
}
}
void
add_element(mixed e)
{
list += ({ e });
sort_in( ++size );
}
private
void
sort_in( int index )
{
int lowerIx, Truth;
mixed swap;
if( index == 1 )
{
return;
}
lowerIx = index >> 1;
Truth = evaluate( rule, list[index], list[lowerIx] );
if( Truth )
{
swap = list[lowerIx];
list[index] = swap;
}
sort_in( lowerIx );
}
mixed
remove_element( int elementIndex )
{
mixed retval;
int upperIx, Truth;
retval = list[elementIndex];
upperIx = elementIndex << 1;
if( upperIx > size )
{
return retval;
}
if( upperIx != size )
{
Truth = evaluate( rule, list[upperIx+1], list[upperIx] );
if( Truth )
{
upperIx++;
}
}
Truth = evaluate( rule, list[elementIndex], list[upperIx] );
if( Truth )
{
return retval;
}
list[elementIndex] = list[upperIx];
if( ( upperIx << 1 ) > size )
{
list = list[0..<2];
size--;
if( !upperIx & 1 )
{
sort_in( upperIx-1 );
}
}
else
{
remove_element( upperIx );
}
}
mixed
get_sorted_list()
{
mixed listState, newList;
int listSize;
listSize = size;
listState = list;
while( size )
{
newList += ({ remove_element(1) });
}
size = listSize;
list = listState;
return newList;
}