diff --git a/datastructure/queue/priorityqueue.go b/datastructure/queue/priorityqueue.go index 8ba8d2b..a02347d 100644 --- a/datastructure/queue/priorityqueue.go +++ b/datastructure/queue/priorityqueue.go @@ -76,7 +76,7 @@ func (q *PriorityQueue[T]) Dequeue() (T, bool) { // swim when child's key is larger than parent's key, exchange them. func (q *PriorityQueue[T]) swim(index int) { - for index > 1 && q.comparator.Compare(index/2, index) < 0 { + for index > 1 && q.comparator.Compare(q.items[index/2], q.items[index]) < 0 { q.swap(index, index/2) index = index / 2 } @@ -89,11 +89,11 @@ func (q *PriorityQueue[T]) sink(index int) { j := 2 * index // get larger child node index - if j < q.size && q.comparator.Compare(j, j+1) < 0 { + if j < q.size && q.comparator.Compare(q.items[j], q.items[j+1]) < 0 { j++ } // if parent larger than child, stop - if !(q.comparator.Compare(index, j) < 0) { + if !(q.comparator.Compare(q.items[index], q.items[j]) < 0) { break } diff --git a/datastructure/queue/priorityqueue_test.go b/datastructure/queue/priorityqueue_test.go index 7acd753..2dd54c1 100644 --- a/datastructure/queue/priorityqueue_test.go +++ b/datastructure/queue/priorityqueue_test.go @@ -37,5 +37,24 @@ func TestPriorityQueue_Enqueue(t *testing.T) { queueData := pq.Data() assert.Equal([]int{10, 9, 6, 7, 8, 2, 5, 1, 4, 3}, queueData) - // assert.IsNotNil(err) +} + +func TestPriorityQueue_Dequeue(t *testing.T) { + assert := internal.NewAssert(t, "TestPriorityQueue_Dequeue") + + comparator := &intComparator{} + pq := NewPriorityQueue[int](10, comparator) + + _, ok := pq.Dequeue() + assert.Equal(false, ok) + + for i := 1; i < 11; i++ { + pq.Enqueue(i) + } + + val, ok := pq.Dequeue() + assert.Equal(true, ok) + assert.Equal(10, val) + + assert.Equal([]int{9, 8, 6, 7, 3, 2, 5, 1, 4}, pq.Data()) }