что не так в этом алгоритме кучи - PullRequest
0 голосов
/ 16 июня 2019

Я не уверен, что не так с моим кодом, и он не преобразовывает массив в кучу. Пожалуйста, помогите !!! указатель a - указатель на массив, передаваемый в функцию (вы уже должны были это выяснить), а z - длина массива. пожалуйста, объясни мне, почему я не прав. Я нуб в кодировании (вы наверняка поняли это и по моему коду). спасибо за ваше драгоценное время.

int heapy(int *a,int z)
{
 for(i = 0; i<z ;i++)
 {   c[i] = a[i];
    for(j = i; j >= 0; --j)
    {   y = (j-1)/2;
        if(c[j] > c[y])
        {   temp = c[y];
            c[y] = c[j];
            c[j] = temp;
            j = y;}
        else
         break;

           }
         }
       }    

1 Ответ

0 голосов
/ 16 июня 2019

Первое замечание: вам не нужен цикл над j, и здесь у вас есть проблема. Это правда, что вы должны присвоить y значение j, но сразу после этого вы уменьшаете j в цикле, так что в итоге вы получаете y - 1. Вам нужно либо просто изменить строку j = y; на j = y + 1, либо изменить цикл на

y = (j - 1) / 2
while (c[j] > c[y]){

   temp = c[y];
   c[y] = c[j];
   c[j] = temp;
   j = y;
   y = (j - 1) / 2;
}

Второй момент: пожалуйста, не сжимайте код таким образом. Новая строка после скобки стала более читабельной.

EDIT: Полная реализация в C ++ выглядит так:

int heapy(int *a, int *c, int z)
{
    for (int i = 0; i < z; i++){
        c[i] = a[i];
        int j = i;
        int y = (j - 1) / 2;
        while(c[j] > c[y]){
            int temp = c[y];
            c[y] = c[j];
            c[j] = temp;
            j = y;
            y = (j - 1) / 2;
        }
    }
}

Если массив элементов i представляет собой кучу, вам следует добавить элемент в его конец и поменять его местами с его родителями, если они меньше его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...