/*******************************************************************************
*
* Project: seft (search engine for text)
*
* File: heap.c
*
* Author: Owen de Kretser (oldk@cs.mu.oz.au)
*
* Organisation: Dept. of CS&SE, University of Melbourne
*
* Date: April 1999
*
* Purpose: heap functions
*
*******************************************************************************/
/***** #includes **************************************************************/
#include "heap.h"
/*******************************************************************************
*
* Function: heap_remove
*
* Purpose: remove top element from a heap
*
*******************************************************************************/
WORD*
heap_remove(WORD** heap, int* size)
{
WORD* temp;
temp = heap[1];
heap[1] = heap[*size];
(*size) -= 1;
heap = heap_down(heap, 1, *size);
return temp;
}
/*******************************************************************************
*
* Function: heap_down
*
* Purpose: perform "downheap" operation on a heap
*
*******************************************************************************/
WORD**
heap_down(WORD** heap, int k, int N)
{
WORD* temp;
int j;
int div = N/2;
temp = heap[k];
while(k <= div)
{
j = k+k;
if(j < N && heap[j]->level < heap[j+1]->level)
j++;
if(temp->level >= heap[j]->level)
break;
heap[k] = heap[j];
k = j;
}
heap[k] = temp;
return heap;
}
/*******************************************************************************
*
* Function: heap_insert
*
* Purpose: insert an element into a heap
*
*******************************************************************************/
WORD**
heap_insert(WORD* new, WORD** heap, int i)
{
heap[i] = new;
heap = heap_up(heap, i);
return heap;
}
/*******************************************************************************
*
* Function: heap_up
*
* Purpose: perform "upheap" operation on a heap
*
*******************************************************************************/
WORD**
heap_up(WORD** heap, int k)
{
WORD* v;
/* make a copy of newly inserted item */
v = heap[k];
/* while parent is less than inserted value move parent down */
while(heap[k/2]->level <= v->level)
{
heap[k] = heap[k/2];
k = k/2;
}
/* now place inserted value at correct place in heap */
heap[k] = v;
return heap;
}
/******************************************************************************/
|