50 PriorityQ *pqNewPriorityQ(
int (*leq)(PQkey key1, PQkey key2) )
52 PriorityQ *pq = (PriorityQ *)memAlloc(
sizeof( PriorityQ ));
53 if (pq == NULL)
return NULL;
55 pq->heap = __gl_pqHeapNewPriorityQ( leq );
56 if (pq->heap == NULL) {
61 pq->keys = (PQHeapKey *)memAlloc( INIT_SIZE *
sizeof(pq->keys[0]) );
62 if (pq->keys == NULL) {
63 __gl_pqHeapDeletePriorityQ(pq->heap);
71 pq->initialized = FALSE;
77 void pqDeletePriorityQ( PriorityQ *pq )
80 if (pq->heap != NULL) __gl_pqHeapDeletePriorityQ( pq->heap );
81 if (pq->order != NULL) memFree( pq->order );
82 if (pq->keys != NULL) memFree( pq->keys );
87 #define LT(x,y) (! LEQ(y,x))
88 #define GT(x,y) (! LEQ(x,y))
89 #define Swap(a,b) do{PQkey *tmp = *a; *a = *b; *b = tmp;}while(0)
92 int pqInit( PriorityQ *pq )
94 PQkey **p, **r, **i, **j, *piv;
95 struct { PQkey **p, **r; } Stack[50], *top = Stack;
96 unsigned long seed = 2016473283;
105 pq->order = (PQHeapKey **)memAlloc( (
size_t)
106 ((pq->size+1) *
sizeof(pq->order[0])) );
111 if (pq->order == NULL)
return 0;
114 r = p + pq->size - 1;
115 for( piv = pq->keys, i = p; i <= r; ++piv, ++i ) {
122 top->p = p; top->r = r; ++top;
123 while( --top >= Stack ) {
126 while( r > p + 10 ) {
127 seed = seed * 1539415821 + 1;
128 i = p + seed % (r - p + 1);
135 do { ++i; }
while( GT( **i, *piv ));
136 do { --j; }
while( LT( **j, *piv ));
140 if( i - p < r - j ) {
141 top->p = j+1; top->r = r; ++top;
144 top->p = p; top->r = i-1; ++top;
149 for( i = p+1; i <= r; ++i ) {
151 for( j = i; j > p && LT( **(j-1), *piv ); --j ) {
158 pq->initialized = TRUE;
159 __gl_pqHeapInit( pq->heap );
163 r = p + pq->size - 1;
164 for( i = p; i < r; ++i ) {
165 assert( LEQ( **(i+1), **i ));
174 PQhandle pqInsert( PriorityQ *pq, PQkey keyNew )
178 if( pq->initialized ) {
179 return __gl_pqHeapInsert( pq->heap, keyNew );
182 if( ++ pq->size >= pq->max ) {
183 PQkey *saveKey= pq->keys;
187 pq->keys = (PQHeapKey *)memRealloc( pq->keys,
189 (pq->max *
sizeof( pq->keys[0] )));
190 if (pq->keys == NULL) {
195 assert(curr != LONG_MAX);
196 pq->keys[curr] = keyNew;
203 PQkey pqExtractMin( PriorityQ *pq )
205 PQkey sortMin, heapMin;
207 if( pq->size == 0 ) {
208 return __gl_pqHeapExtractMin( pq->heap );
210 sortMin = *(pq->order[pq->size-1]);
211 if( ! __gl_pqHeapIsEmpty( pq->heap )) {
212 heapMin = __gl_pqHeapMinimum( pq->heap );
213 if( LEQ( heapMin, sortMin )) {
214 return __gl_pqHeapExtractMin( pq->heap );
219 }
while( pq->size > 0 && *(pq->order[pq->size-1]) == NULL );
224 PQkey pqMinimum( PriorityQ *pq )
226 PQkey sortMin, heapMin;
228 if( pq->size == 0 ) {
229 return __gl_pqHeapMinimum( pq->heap );
231 sortMin = *(pq->order[pq->size-1]);
232 if( ! __gl_pqHeapIsEmpty( pq->heap )) {
233 heapMin = __gl_pqHeapMinimum( pq->heap );
234 if( LEQ( heapMin, sortMin )) {
242 int pqIsEmpty( PriorityQ *pq )
244 return (pq->size == 0) && __gl_pqHeapIsEmpty( pq->heap );
248 void pqDelete( PriorityQ *pq, PQhandle curr )
251 __gl_pqHeapDelete( pq->heap, curr );
255 assert( curr < pq->max && pq->keys[curr] != NULL );
257 pq->keys[curr] = NULL;
258 while( pq->size > 0 && *(pq->order[pq->size-1]) == NULL ) {