Priority queue: Difference between revisions

Line 4,032:
(Feed cat)
(Make tea)</pre>
=== Alternative version using a pairing heap: ===
<lang PicoLisp>
(de heap-first (H) (car H))
 
(de heap-merge (H1 H2)
(cond
((= H1 NIL) H2)
((= H2 NIL) H1)
((< (car H1) (car H2))
(cons (car H1) (cons H2 (cdr H1))))
(T
(cons (car H2) (cons H1 (cdr H2))))))
 
(de heap-insert (Item Heap)
(heap-merge (list Item) Heap))
 
(de "merge-pairs" (H)
(if (= (cdr H) NIL)
(car H) # also handles NIL (H = NIL -> NIL)
(heap-merge
(heap-merge (car H) (cadr H))
("merge-pairs" (cddr H)))))
 
(de heap-rest (H)
("merge-pairs" (cdr H)))
</lang>
Test:
<lang PicoLisp>
(setq H NIL)
(for
Task '(
(3 . "Clear drains.")
(4 . "Feed cat.")
(5 . "Make tea.")
(1 . "Solve RC tasks.")
(2 . "Tax Return."))
(setq H (heap-insert Task H)))
 
(while H
(prinl (caar H) ". " (cdar H))
(setq H (heap-rest H)))
 
(bye)
</lang>
{{Out}}
<pre>
1. Solve RC tasks.
2. Tax Return.
3. Clear drains.
4. Feed cat.
5. Make tea.
</pre>
 
=={{header|Prolog}}==
357

edits