插入已排序的Array-Queue

时间:2013-05-16 19:14:31

标签: java arrays queue sorted

我正在处理像优先级队列这样的已排序队列。我已经用List做了它,它已经很好用了。现在我想用数组做。但是我有一点逻辑问题,添加一个新元素并将其插入到排序数组中。

最终输出应该是这样的:
优先级:5值:x
优先级:4值:iso
....(等等)
所以具有最高优先级的元素应该在索引= 0上 我只是不知道(是的,我知道它只是简单地切换它,但我不能这样做:/)怎么做...

我已经尝试了一些东西,但我被卡住了......:/可以请任何人帮忙吗?

这是我的代码:

public class Queue {

private QueueElem[] a;

public Queue(int capacity) 
{
    QueueElem[] tempQueue = new QueueElem[capacity];
    a= tempQueue;
}

public void enqueue(int p, String v) 
{
    QueueElem neu = new QueueElem(p,v);
    int i=0;

        while(i<a.length) 
        {
            if (a[i] == null) 
            {
                a[i] = neu;
                break;
            }   
            i++;
        }
}

public void writeQueue()
{
    int i=0;
    while((i< a.length) && (a[i] != null))
    {
        System.out.println("Priority: " + a[i].priority + " Value: " + a[i].value);
        i++;
    }
}

public static void main(String args[])
{
    Queue neu = new Queue(10);
    neu.enqueue(4,"iso");
    neu.enqueue(2,"abc");
    neu.enqueue(5,"x");
    neu.enqueue(1,"abc");
    neu.enqueue(4,"bap");
    neu.enqueue(2,"xvf");
    neu.enqueue(4,"buep");  
}
 }//end class Queue


class QueueElem {
int priority;
String value = new String();

public QueueElem(){ }

public QueueElem(int p, String v)
{
    this.priority = p;
    this.value = v;
}

public int getPrio()
{
    return this.priority;
}

public String getValue()
{
    return this.value;
}   
}

2 个答案:

答案 0 :(得分:0)

如果将数组解释为最大堆,那会更好。这是实现优先级队列的典型方法。

如果您正在尝试为优先级队列维护已排序的数组,那么您正在寻找的是实现insertion sort(有点;您没有一个未排序的数组开始。你。有一个你只需添加的空数组,同时保持排序顺序)。每次插入一个新元素时,您将遍历数组以找到正确的点,然后将其插入那里,然后将当前位置移动到那个位置,并将其后的所有内容都移到一个点之后。请注意,这不像使用堆实现它那样高效,因为最坏的情况是每次插入时都有O(n)性能,而对于堆,则有O(logn)

答案 1 :(得分:0)

我不明白为什么有人想要使用原始数组...特别是现在你已经用List实现了它。

如果您想了解如何在原始数组中插入元素,请查看ArrayList的代码,因为它下面使用的是原始数组。您必须将所有元素移动到插入点的右侧,您可以将其复制到循环中,或者使用System.arraycopy()。但最糟糕的部分是你可能不得不创建一个新数组,因为当你添加一个元素时,数组大小会增加一个(这取决于你使用的数组是否具有与数据大小完全相同的数组,或者更大的数组,就像在ArrayList中完成的那样。)