插入/排序到循环优先级队列的算法

时间:2014-07-09 15:47:29

标签: java algorithm queue priority-queue circular-buffer

// gives next index in array which wraps around in a ring; moves clockwise through indices 
private int nextSlot(int k) { 
  return ((k + 1) % A.length); 
} 

// Insert method
public void insert(int k) {
   if( size == A.length)
       resize();
   A[next] = k;
   for(int i = 0; i < next; i = nextSlot(i)) {
       if(k < A[i]) {
           for( int j = next - 1; j >= i; j--){
               A[nextSlot(j)] = A[j];
           }
           A[i] = k;
           break;
       }
   }
   next = nextSlot(next);
   size++;
} 

我正在尝试创建一个插入/排序方法,该方法按升序将值插入循环优先级队列。我遇到的问题是当下一个指针循环回到数组的开头时,队列前面的项目没有被排序。我一直在努力工作几个小时,任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

具体来说,当 next 循环回到开头时,它将变为0,因此这个循环:

for(int i = 0; i < next; i = nextSlot(i)) {

不会做任何事情。

但是,一般情况下,我发现您的程序存在一些问题。首先,为什么要将其实现为循环数组?当您希望能够从数组的开头和结尾快速添加/删除时,循环数组非常有用。您似乎插入到中间,因此当您在每个插入处对整个列表进行线性搜索时,没有理由使代码复杂化。

最后,请注意,在圆形阵列上操作时,需要考虑到索引将环绕并变为0.因此,这一行:

for( int j = next - 1; j >= i; j--)

至少有两个原因是错误的:

  1. j&gt; =我不是找出j是否已达到i的正确方法
  2. j--也是错误的,因为j-1需要被包裹