// 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++;
}
Я пытаюсь создать метод insert/sort, который вставляет значения в очередь круговых приоритетов в порядке возрастания. Проблема, с которой я столкнулась, - это когда следующий указатель циклически возвращается к началу массива, элементы в передней части очереди не сортируются. Я боролся с этим в течение нескольких часов, любая помощь была бы весьма признательна.
В частности, когда следующие циклы возвращаются к началу, это будет 0, и поэтому это для цикла:
for(int i = 0; i < next; i = nextSlot(i)) {
ничего не сделают.
В целом, однако, я вижу несколько проблем с вашей программой. Прежде всего, почему вы реализуете это как круговой массив? Круговые массивы полезны, когда вы хотите быстро добавлять/удалять как из начала, так и из конца массива. Вы, кажется, вставляете в середину, поэтому нет причин усложнять свой код, когда вы все равно выполняете линейный поиск по всему списку в каждой вкладке.
Наконец, имейте в виду, что при работе в круговом массиве вам нужно учитывать, что ваши индексы будут обертываться и стать 0. Поэтому эта строка:
for( int j = next - 1; j >= i; j--)
неправильно по крайней мере по двум причинам: