@SergeySerge11

Где ошибка, как из рекурсии цикл сделать?

Метод для очереди с приоритетом?
// не правильно работает
       private void siftDown2(int i)
       {
           int l ;
           int r ;
           int j = i;
           do
           {
               l = getLeft(i);
               r = getRight(i);
               j = i;
               if (l < size && elems[j] < elems[l])
                   j = l;
               if (r < size && elems[j] < elems[r])
                   j = r;
               if (j != i)
               {
                   swap(i, j);
                   i = j; 
               }

           } while (j != i);
       }
// работает
       private void siftDown(int i)
       {
           var l = getLeft(i);
           var r = getRight(i);
           int j = i;
           l = getLeft(j);
           r = getRight(j);
           j = i;
           if (l < size && elems[j] < elems[l])
               j = l;
           if (r < size && elems[j] < elems[r])
               j = r;
           if (j != i)
           {
               swap(i, j);
               siftDown(j);
           }
       }

Другой вопрос, много раз ее реализовывал, есть ли в c# или где-то реализация очереди с приоритетом с произвольным доступом, уже кучу раз реализовал, лень постоянно.
  • Вопрос задан
  • 114 просмотров
Решения вопроса 1
@mvv-rus
Настоящий админ AD и ненастоящий программист
//...declarations and initializations omitted
           do
           {
               //...some code omitted
               if (j != i)
               {
                   swap(i, j);
                   i = j; 
               }
           } while (j != i);

Не работает, потому что вы сначала присваете j значение i, если они не равны, а потом, в условии продолжения цикла, сравниваете их значения. Естественно, они будут равны и выход их цикла получится на первой же итерации. Проверять i==j как условие выхода из цикла надо чуть раньше, например, так:
//...declarations and initializations omitted
           do
           {
               //...some code omitted
               if (j != i)
               {
                   swap(i, j);
                   i = j; 
               }
               else break;
           } while (true);


Ну, а что до второго вопроса, то в .NET, начиная с 6.0 есть класс System.Collections.Generic.PriorityQueue<TElement,...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы