in csharp/src/Containers/HeapWithDictionary.cs [318:357]
private HeapEntry PopHeap()
{
HeapEntry returnValue = elements[0];
keys.Remove(elements[0].Key);
int last = head;
head = elements[0].key;
keysPosition[head] = -last - 1;
elements[0] = elements[count - 1];
HeapEntry value = elements[count - 1];
count--;
int current = 0;
if (count == 0) return returnValue;
while (current < count)
{
int left = (current << 1) + 1;
int right = (current << 1) + 2;
int swapIndex = current;
if (left > count) swapIndex = current;
else
if (right > count)
{
if (comparer.Compare(elements[left].Value, value.Value) < 0) swapIndex = left;
}
else
{
if (comparer.Compare(elements[left].Value, elements[right].Value) < 0)
{
if (comparer.Compare(elements[left].Value, value.Value) < 0) swapIndex = left;
}
else if (comparer.Compare(elements[right].Value, value.Value) < 0) swapIndex = right;
}
if (swapIndex == current) break;
elements[current] = elements[swapIndex];
keysPosition[elements[current].key] = current;
current = swapIndex;
}
elements[current] = value;
keysPosition[elements[current].key] = current;
return returnValue;
}