Возникли проблемы при вставке в кучу

0

Ниже приведен мой C++ код для вставки в кучу. Значение k вставляется, но оно вставлено снизу. Я ожидал, что он будет изнашиваться с этим циклом while.

void Insert(heap1* myHeap, int k)
{
    (myHeap->size)++;
    int i = myHeap->size;

    while (i > 1 && myHeap->H[i/2].key < k)
    {
        myHeap->H[i].key = myHeap->H[i/2].key;
        i = i/2;
    }
    myHeap->H[i].key = k;
}

У меня есть процедура heapify, которую я пытался использовать для этого, прежде чем эта попытка, которую я знаю, работает в моих других процедурах кучи. Я просто не могу заставить его работать внутри Insert, поэтому я пошел с вышеуказанным маршрутом. Ниже приведена информация на всякий случай:

void heapify(heap1* myHeap, int i)
{
    int l = 2 * i;
    int r = 2 * i + 1;
    int largest;

    if (l <= myHeap->size && myHeap->H[l].key > myHeap->H[i].key)
        largest = l;
    else
        largest = i;
    if (r <= myHeap->size && myHeap->H[r].key > myHeap->H[largest].key)
        largest = r;
    if (largest != i)
        {
        myHeap->H[i].key = myHeap->H[i].key + myHeap->H[largest].key;
        myHeap->H[largest].key = myHeap->H[i].key - myHeap->H[largest].key;
        myHeap->H[i].key = myHeap->H[i].key - myHeap->H[largest].key;
        heapify(myHeap, largest);
    }
}

Если бы кто-то мог привести меня в правильном направлении, как заставить его восстановить свои свойства кучи, я бы в значительной степени его оценил.

  • 0
    Не то, чтобы это heap1 значение в данный момент, но включение декларации о том, что на heap1 деле представляет собой heap1 а не то, что нам приходится догадываться, было бы, вероятно, полезным. И я не совсем уверен, почему у вас вообще есть это как структура, кроме как прикрепить атрибут размера вдоль массива.
Теги:
heap

1 ответ

0

попробуйте использовать этот код:

void insert(int heap[], int *n, int item){
    (*n)++;
    heap[*n] = item;
    reheapify_upward(heap, *n); 
}

void reheapify_upward(int heap[],int start){
    int temp,parent;
    if(start>1){
        parent=start/2;
        if(heap[parent]<heap[start]){
             temp=heap[start];
             heap[start]=heap[parent];
             heap[parent]=temp;
             reheapify_upward(heap,parent);
        }
    }
}   
  • 0
    Для получения дополнительной помощи вы можете посетить этот блог: Основные кодировки

Ещё вопросы

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