public class HeapQueue<T> where T : IComparable<T> {
private List<T> array = new List<T>();
public int Count {
get {
return array.Count;
}
}
private void Swap(int idx1, int idx2) {
T temp = array[idx1];
array[idx1] = array[idx2];
array[idx2] = temp;
}
private void UpdateHeapUp(int index) {
if (0 == index) {
return;
}
int parent = index >> 1;
if (1 != array[parent].CompareTo(array[index])) {
return;
}
Swap(index, parent);
UpdateHeapUp(parent);
}
private void UpdateHeapDown(int index) {
int leftChild = index << 1;
if (array.Count <= leftChild) {
return;
}
int rightChild = leftChild | 1;
int swapIndex = index;
if (-1 == array[leftChild].CompareTo(array[swapIndex])) {
swapIndex = leftChild;
}
if (rightChild < array.Count && -1 == array[rightChild].CompareTo(array[swapIndex])) {
swapIndex = rightChild;
}
if (swapIndex == index) {
return;
}
Swap(index, swapIndex);
UpdateHeapDown(swapIndex);
}
public void Enqueue(T value) {
array.Add(value);
UpdateHeapUp(array.Count - 1);
}
public T Dequeue() {
if (0 == array.Count) {
throw new InvalidOperationException();
}
T retValue = array[0];
array[0] = array[array.Count - 1];
array.RemoveAt(array.Count - 1);
UpdateHeapDown(0);
return retValue;
}
}
C# 优先队列实现
最新推荐文章于 2024-06-23 11:10:17 发布
本文介绍了一个使用C#实现的泛型堆队列数据结构,名为HeapQueue。该数据结构支持IComparable接口,提供了enqueue和dequeue操作,通过维护堆属性确保元素的有序性。文章详细展示了类的定义、属性、方法及内部维护堆的操作。
摘要由CSDN通过智能技术生成