/// <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++; }
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; }