void BubbleDownMin(int index) { int l = HeapUtils.Left(index); int r = HeapUtils.Right(index); // bubbling down, 2 kids while (r <= Count) { // if heap property is violated between index and Left child if (values[index] > values[l]) { if (values[l] > values[r]) { Swap(index, r); // right has smaller priority index = r; } else { Swap(index, l); // left has smaller priority index = l; } } else { // if heap property is violated between index and R if (values[index] > values[r]) { Swap(index, r); index = r; } else { index = l; l = HeapUtils.Left(index); break; } } l = HeapUtils.Left(index); r = HeapUtils.Right(index); } // only left & last children available to test and swap if (l <= Count && values[index] > values[l]) { Swap(index, l); } }