1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- /**************************************************
- *
- * fixHa.c (for spread)
- * This routine is to restore a 'heap' order upon
- * removing a cell from the heap, which is ordered
- * by the min_cost of a cell.
- *
- **************************************************/
- #include <stdlib.h>
- #include "costHa.h"
- #include "local_proto.h"
- struct costHa *fixHa(long go_pos, struct costHa *heap, long heap_len)
- {
- long vacant, smaller_child;
- if (heap_len == 0)
- return NULL;
- vacant = go_pos;
- while (2 * vacant <= heap_len) {
- smaller_child = 2 * vacant;
- if ((2 * vacant < heap_len) &&
- (heap[2 * vacant + 1].min_cost < heap[2 * vacant].min_cost))
- smaller_child++;
- if (heap[heap_len].min_cost > heap[smaller_child].min_cost) {
- heap[vacant].min_cost = heap[smaller_child].min_cost;
- heap[vacant].angle = heap[smaller_child].angle;
- heap[vacant].row = heap[smaller_child].row;
- heap[vacant].col = heap[smaller_child].col;
- vacant = smaller_child;
- }
- else
- break;
- }
- heap[vacant].min_cost = heap[heap_len].min_cost;
- heap[vacant].angle = heap[heap_len].angle;
- heap[vacant].row = heap[heap_len].row;
- heap[vacant].col = heap[heap_len].col;
- return heap;
- }
|