Beispiel #1
0
/*
  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;
        }
    }
}
Beispiel #2
0
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;
}