我正在处理像优先级队列这样的已排序队列。我已经用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;
}
}
答案 0 :(得分:0)
如果将数组解释为最大堆,那会更好。这是实现优先级队列的典型方法。
如果您正在尝试为优先级队列维护已排序的数组,那么您正在寻找的是实现insertion sort(有点;您没有一个未排序的数组开始。你。有一个你只需添加的空数组,同时保持排序顺序)。每次插入一个新元素时,您将遍历数组以找到正确的点,然后将其插入那里,然后将当前位置移动到那个位置,并将其后的所有内容都移到一个点之后。请注意,这不像使用堆实现它那样高效,因为最坏的情况是每次插入时都有O(n)
性能,而对于堆,则有O(logn)
。
答案 1 :(得分:0)
我不明白为什么有人想要使用原始数组...特别是现在你已经用List实现了它。
如果您想了解如何在原始数组中插入元素,请查看ArrayList的代码,因为它下面使用的是原始数组。您必须将所有元素移动到插入点的右侧,您可以将其复制到循环中,或者使用System.arraycopy()。但最糟糕的部分是你可能不得不创建一个新数组,因为当你添加一个元素时,数组大小会增加一个(这取决于你使用的数组是否具有与数据大小完全相同的数组,或者更大的数组,就像在ArrayList中完成的那样。)