Алгоритм для вставки / сортировки в очередь с круговым приоритетом

1
// 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, который вставляет значения в очередь круговых приоритетов в порядке возрастания. Проблема, с которой я столкнулась, - это когда следующий указатель циклически возвращается к началу массива, элементы в передней части очереди не сортируются. Я боролся с этим в течение нескольких часов, любая помощь была бы весьма признательна.

Теги:
algorithm
queue
priority-queue
circular

1 ответ

0

В частности, когда следующие циклы возвращаются к началу, это будет 0, и поэтому это для цикла:

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

ничего не сделают.

В целом, однако, я вижу несколько проблем с вашей программой. Прежде всего, почему вы реализуете это как круговой массив? Круговые массивы полезны, когда вы хотите быстро добавлять/удалять как из начала, так и из конца массива. Вы, кажется, вставляете в середину, поэтому нет причин усложнять свой код, когда вы все равно выполняете линейный поиск по всему списку в каждой вкладке.

Наконец, имейте в виду, что при работе в круговом массиве вам нужно учитывать, что ваши индексы будут обертываться и стать 0. Поэтому эта строка:

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

неправильно по крайней мере по двум причинам:

  1. j> = я не является правильным способом выяснить, достиг ли j до i
  2. j-- также ошибочно, поскольку j-1 необходимо обернуть
  • 0
    Я пытаюсь сделать это для домашнего задания, поэтому я реализую это как круговой массив. Я вижу, что вы говорите с первым для цикла. Когда я изменил его для for (int i = 0; i <= next; i = nextSlot (i)), моя программа не выдавала никаких ошибок, но не завершила выполнение. А для второго цикла я изменил j> = i на j == i и создал метод previousSlot, чтобы обернуть j. Когда я запускаю его с этими изменениями, ничего больше не сортируется.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню