/// <summary>
        /// Extract the item of the root
        /// </summary>
        /// <returns></returns>
        public IPriorityQueueNode <K, T> Pop()
        {
            IPriorityQueueNode <K, T> item = _data[0];

            Size--;
            _data[0] = _data[Size];
            HeapifyDown(0);
            return(item);
        }
 /// <summary>
 /// Add an item to the heap
 /// </summary>
 /// <param name="item"></param>
 public void Insert(IPriorityQueueNode <K, T> item)
 {
     if (Size == _data.Length)
     {
         Resize();
     }
     _data[Size] = item;
     HeapifyUp(Size);
     Size++;
 }
Exemple #3
0
 public int CompareTo(IPriorityQueueNode <K, T> other)
 {
     if (Priority.CompareTo(other.Priority) < 0)
     {
         return(-1);
     }
     else if (Priority.CompareTo(other.Priority) > 0)
     {
         return(1);
     }
     return(0);
 }
 private void HeapifyUp(int childIdx)
 {
     if (childIdx > 0)
     {
         int parentIdx = (childIdx - 1) / 2;
         if (_comparison.Invoke(_data[childIdx].Priority, _data[parentIdx].Priority) > 0)
         {
             // swap parent and child
             IPriorityQueueNode <K, T> t = _data[parentIdx];
             _data[parentIdx] = _data[childIdx];
             _data[childIdx]  = t;
             HeapifyUp(parentIdx);
         }
     }
 }
        private void HeapifyDown(int parentIdx)
        {
            int leftChildIdx    = 2 * parentIdx + 1;
            int rightChildIdx   = leftChildIdx + 1;
            int largestChildIdx = parentIdx;

            if (leftChildIdx < Size && _comparison.Invoke(_data[leftChildIdx].Priority, _data[largestChildIdx].Priority) > 0)
            {
                largestChildIdx = leftChildIdx;
            }
            if (rightChildIdx < Size && _comparison.Invoke(_data[rightChildIdx].Priority, _data[largestChildIdx].Priority) > 0)
            {
                largestChildIdx = rightChildIdx;
            }
            if (largestChildIdx != parentIdx)
            {
                IPriorityQueueNode <K, T> t = _data[parentIdx];
                _data[parentIdx]       = _data[largestChildIdx];
                _data[largestChildIdx] = t;
                HeapifyDown(largestChildIdx);
            }
        }
 private void Resize()
 {
     IPriorityQueueNode <K, T>[] resizedData = new IPriorityQueueNode <K, T> [_data.Length * 2];
     Array.Copy(_data, 0, resizedData, 0, _data.Length);
     _data = resizedData;
 }