8 set(Heap
*h
, size_t k
, void *x
)
16 swap(Heap
*h
, size_t a
, size_t b
)
21 set(h
, a
, h
->data
[b
]);
27 less(Heap
*h
, size_t a
, size_t b
)
29 return h
->less(h
->data
[a
], h
->data
[b
]);
34 siftdown(Heap
*h
, size_t k
)
37 size_t p
= (k
-1) / 2; /* parent */
39 if (k
== 0 || less(h
, p
, k
)) {
50 siftup(Heap
*h
, size_t k
)
53 size_t l
= k
*2 + 1; /* left child */
54 size_t r
= k
*2 + 2; /* right child */
56 /* find the smallest of the three */
58 if (l
< h
->len
&& less(h
, l
, s
)) s
= l
;
59 if (r
< h
->len
&& less(h
, r
, s
)) s
= r
;
62 return; /* satisfies the heap property */
71 // Heapinsert inserts x into heap h according to h->less.
72 // It returns 1 on success, otherwise 0.
74 heapinsert(Heap
*h
, void *x
)
76 if (h
->len
== h
->cap
) {
78 size_t ncap
= (h
->len
+1) * 2; /* allocate twice what we need */
80 ndata
= malloc(sizeof(void*) * ncap
);
85 memcpy(ndata
, h
->data
, sizeof(void*) * h
->len
);
100 heapremove(Heap
*h
, size_t k
)
106 void *x
= h
->data
[k
];
108 set(h
, k
, h
->data
[h
->len
]);