8#define HEAP_INITIAL_CAP 16
16static void swap(
int *a,
int *b) {
int t = *a; *a = *b; *b = t; }
19 heap_t *h = malloc(
sizeof(*h));
22 if (!h->
data) { free(h);
return NULL; }
36 int *grown = realloc(h->
data, new_cap *
sizeof(
int));
37 if (!grown)
return false;
45 size_t parent = (i - 1) / 2;
46 if (arr[parent] <= arr[i])
break;
47 swap(&arr[parent], &arr[i]);
54 size_t left = 2 * i + 1;
55 size_t right = 2 * i + 2;
57 if (left < n && arr[left] < arr[smallest]) smallest = left;
58 if (right < n && arr[right] < arr[smallest]) smallest = right;
59 if (smallest == i)
break;
60 swap(&arr[i], &arr[smallest]);
75 if (!h || h->
size == 0)
return false;
76 if (out_value) *out_value = h->
data[0];
86 if (!h || h->
size == 0)
return false;
87 if (out_value) *out_value = h->
data[0];
97 for (
size_t i = n / 2; i > 0; i--) {
105 size_t left = 2 * i + 1;
106 size_t right = 2 * i + 2;
108 if (left < n && arr[left] > arr[largest]) largest = left;
109 if (right < n && arr[right] > arr[largest]) largest = right;
110 if (largest == i)
break;
111 swap(&arr[i], &arr[largest]);
static bool heap_grow(heap_t *h)
bool heap_peek_min(const heap_t *h, int *out_value)
void heap_destroy(heap_t *h)
void heap_sift_down_max(int *arr, size_t i, size_t n)
void heap_build_min(int *arr, size_t n)
heap_t * heap_create(void)
bool heap_extract_min(heap_t *h, int *out_value)
bool heap_is_empty(const heap_t *h)
bool heap_insert(heap_t *h, int value)
size_t heap_size(const heap_t *h)
static void sift_up_min(int *arr, size_t i)
static void sift_down_min(int *arr, size_t i, size_t n)
static void swap(int *a, int *b)
Binary min-heap (array-backed priority queue) of int.