/* Implemented so that end should be the length of the heap, rather than the index of the last element. Swap the '<' to '<=' to make end the index of the last element. */ static void sift_down(binary_heap *heap, long root, long end) { long l,r,swap; while((l = heap_left_child(root)) < end) { r = heap_right_child(root); swap = root; //should we swap with the left if(heap->cmp(heap->heap[l],heap->heap[swap])) { swap = l; }//can I make this next if and else if? if(r < end && heap->cmp(heap->heap[r],heap->heap[swap])) { swap = r; } if(swap != root) { SWAP(heap->heap[root],heap->heap[swap]); root = swap; } else { return; } } }
void heap_bubble_down(Heap* heap, int index) { if(heap_left_child_index(index) <= heap_last_index(heap)) { int left_compare = heap->comparator(heap_get(heap, index), heap_left_child(heap, index)); if(1 == left_compare) { heap_swap(heap, index, heap_left_child_index(index)); heap_bubble_down(heap, heap_left_child_index(index)); return; } } if(heap_right_child_index(index) <= heap_last_index(heap)) { int right_compare = heap->comparator(heap_get(heap, index), heap_right_child(heap, index)); if(1 == right_compare) { heap_swap(heap, index, heap_right_child_index(index)); heap_bubble_down(heap, heap_right_child_index(index)); return; } } return; }