我试图在c Sharp中实现此优先级队列。 这是我的代码:
public class PriorityQueue<T> where T : IComparable<T>
{
private List<T> data;
public PriorityQueue()
{
this.data = new List<T>();
}
public void Add(T item)
{
data.Add(item);
int child = data.Count - 1;
while (child > 0)
{
int parent = (child + 1) / 2;
if ((data[child].CompareTo(data[parent])) >= 0)
break;
T temp = data[child];
data[child] = data[parent];
data[parent] = temp;
child = parent;
}
}
public T Get()
{
int last = data.Count - 1;
T root = data[0];
data[0] = data[last];
data.RemoveAt(last);
--last;
int parent = 0;
while (true)
{
int child = (parent * 2) + 1;
if (child > last)
break;
if (child > last)
break;
int next = child + 1;
if (next <= last && data[next].CompareTo(data[child]) < 0)
child = next;
if (data[parent].CompareTo(data[child]) <= 0)
break;
T temp = data[parent];
data[parent] = data[child];
data[child] = temp;
parent = child;
}
return root;
}
public int Count()
{
return data.Count;
}
}
但是,最终结果是,除我“获得”的第一个项目外,优先队列中的每个项目都已正确排序。第一个似乎是完全随机的顺序。其他所有项目似乎都井井有条。不知道我在做什么错。
答案 0 :(得分:0)
简单的小错误。在添加函数中,“父”的初始化不正确。您应该从“孩子”中减去一个,而不要添加1。应该是这样:
int parent = (child - 1) / 2;