C#中的PriorityQueue初始化未正确排序

时间:2018-07-11 22:13:23

标签: c# data-structures queue priority-queue

我试图在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;
    }
}

但是,最终结果是,除我“获得”的第一个项目外,优先队列中的每个项目都已正确排序。第一个似乎是完全随机的顺序。其他所有项目似乎都井井有条。不知道我在做什么错。

1 个答案:

答案 0 :(得分:0)

简单的小错误。在添加函数中,“父”的初始化不正确。您应该从“孩子”中减去一个,而不要添加1。应该是这样:

int parent = (child - 1) / 2;