AdlsDotNetSDK/QueueTools/PriorityQueue.cs (114 lines of code) (raw):
using System;
namespace Microsoft.Azure.DataLake.Store.QueueTools
{
/// <summary>
/// Priority Queue
/// </summary>
/// <typeparam name="T"></typeparam>
internal class PriorityQueue<T> where T:IComparable
{
private const int InitialCapacity = 102400;
private int _capacity;
internal int Capacity{
get
{
return _capacity;
}
}
private const int GrowFactor=2;
private T[] _heap;
private int _heapSize;
internal int HeapSize {
get {
return _heapSize;
}
}
private int Parent(int index)
{
return (index - 1) / 2;
}
private int Left(int index)
{
return 2 * index + 1;
}
private int Right(int index)
{
return 2 * index + 2;
}
internal PriorityQueue()
{
_heap=new T[InitialCapacity];
_capacity = InitialCapacity;
_heapSize = 0;
}
internal PriorityQueue(int capacity)
{
_heap=new T[capacity];
_capacity = capacity;
_heapSize = 0;
}
private void Grow()
{
_capacity = _capacity * GrowFactor;
T[] newHeap=new T[_capacity];
Array.Copy(_heap,newHeap,_heap.Length);
_heap = newHeap;
}
internal void Add(T elem)
{
if (_heapSize >= _capacity)
{
Grow();
}
_heap[_heapSize++] = elem;
Bubble();
}
internal T SeekMax()
{
return _heap[0];
}
internal T GetMax()
{
T ret;
ret = _heap[0];
_heap[0] = _heap[--_heapSize];
_heap[_heapSize] = default(T); // Set it null to get cleaned by GC
MaxHeapify(0);
return ret;
}
private void MaxHeapify(int index)
{
T largest=_heap[index];
int largestIndex = index;
int left = Left(index);
int right = Right(index);
if (left < _heapSize && _heap[left] .CompareTo(largest)>0)
{
largestIndex = left;
largest = _heap[left];
}
if (right< _heapSize && _heap[right].CompareTo(largest) > 0)
{
largestIndex = right;
}
if (largestIndex != index)
{
Swap(index, largestIndex);
MaxHeapify(largestIndex);
}
}
private void Bubble()
{
int i = _heapSize - 1;
int parent = Parent(i);
while (i > 0 && _heap[i].CompareTo(_heap[parent]) > 0)
{
Swap(i, parent);
i = parent;
parent = Parent(i);
}
}
private void Swap(int ind1, int ind2)
{
T temp = _heap[ind1];
_heap[ind1] = _heap[ind2];
_heap[ind2] = temp;
}
}
}