diff --git a/src/heap.c b/src/heap.c index 124cd1e..f6c1bb7 100644 --- a/src/heap.c +++ b/src/heap.c @@ -57,16 +57,33 @@ static void heap_fixed_up(struct _heap* self, int i) { assert(self != NULL); int p = 0; - while(1) + if(self->_min_flag != true) { - p = parent(i); - // 若当前节点大于其父节点,则交换位置,否则退出循环 - if(p < 0 || self->compare(self->obj + i * self->_obj_size, self->obj + p * self->_obj_size) <= 0) + while(1) { - break; + p = parent(i); + // 若当前节点大于其父节点,则交换位置,否则退出循环 + if(p < 0 || self->compare(self->obj + i * self->_obj_size, self->obj + p * self->_obj_size) <= 0) + { + break; + } + heap_swap(self, i, p); + i = p; + } + } + else + { + while(1) + { + p = parent(i); + // 若当前节点大于其父节点,则交换位置,否则退出循环 + if(p < 0 || self->compare(self->obj + i * self->_obj_size, self->obj + p * self->_obj_size) >= 0) + { + break; + } + heap_swap(self, i, p); + i = p; } - heap_swap(self, i, p); - i = p; } } @@ -88,29 +105,57 @@ static void heap_fixed_down(struct _heap* self, int i) { assert(self != NULL); int l = 0,r = 0; - int max = 0; + int max = 0, min = 0; - while(1) + if(self->_min_flag != true) { - l = left(i); - r = right(i); - max = i; + while(1) + { + l = left(i); + r = right(i); + max = i; - if(l < self->size(self) && self->compare(self->obj + l * self->_obj_size, self->obj + max * self->_obj_size) > 0) - { - max = l; - } + if(l < self->size(self) && self->compare(self->obj + l * self->_obj_size, self->obj + max * self->_obj_size) > 0) + { + max = l; + } - if(r < self->size(self) && self->compare(self->obj + r * self->_obj_size, self->obj + max * self->_obj_size) > 0) - { - max = r; + if(r < self->size(self) && self->compare(self->obj + r * self->_obj_size, self->obj + max * self->_obj_size) > 0) + { + max = r; + } + if(max == i) + { + break; + } + heap_swap(self, i, max); + i = max; } - if(max == i) + } + else + { + while(1) { - break; + l = left(i); + r = right(i); + min = i; + + if(l < self->size(self) && self->compare(self->obj + l * self->_obj_size, self->obj + min * self->_obj_size) < 0) + { + min = l; + } + + if(r < self->size(self) && self->compare(self->obj + r * self->_obj_size, self->obj + min * self->_obj_size) < 0) + { + min = r; + } + if(min == i) + { + break; + } + heap_swap(self, i, min); + i = min; } - heap_swap(self, i, max); - i = max; } } diff --git a/test/test_heap.c b/test/test_heap.c index dc81fe3..5c5a2b6 100644 --- a/test/test_heap.c +++ b/test/test_heap.c @@ -27,7 +27,7 @@ void test_heap_num(void) // default: maxheap // maxheap or minheap - // heap->setmin(heap, true); + heap->setmin(heap, true); printf("\n\n----- test_heap_num -----\n"); @@ -44,7 +44,7 @@ void test_heap_num(void) printf("\n"); } - printf("----- max -----\n"); + printf("----- max/min -----\n"); heap->peek(heap, &temp); heap->print_obj(&temp); printf("\n");