// 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++;
}
我正在尝试创建一个插入/排序方法,该方法按升序将值插入循环优先级队列。我遇到的问题是当下一个指针循环回到数组的开头时,队列前面的项目没有被排序。我一直在努力工作几个小时,任何帮助都将不胜感激。
答案 0 :(得分:0)
具体来说,当 next 循环回到开头时,它将变为0,因此这个循环:
for(int i = 0; i < next; i = nextSlot(i)) {
不会做任何事情。
但是,一般情况下,我发现您的程序存在一些问题。首先,为什么要将其实现为循环数组?当您希望能够从数组的开头和结尾快速添加/删除时,循环数组非常有用。您似乎插入到中间,因此当您在每个插入处对整个列表进行线性搜索时,没有理由使代码复杂化。
最后,请注意,在圆形阵列上操作时,需要考虑到索引将环绕并变为0.因此,这一行:
for( int j = next - 1; j >= i; j--)
至少有两个原因是错误的: