Как исправить мои методы heapify - правильный вывод, но не получая полных баллов за домашнюю работу - PullRequest
0 голосов
/ 26 апреля 2019

У меня проблема с домашней работой, когда я пишу функции heapify и percolateDown. Я получаю правильный вывод, но онлайн-грейдер говорит, что он не в нужной минимальной куче. Это моя проблема с percolateDown или с heapify?

Я попытался изменить итерацию метода heapify, чтобы увидеть, исправило ли это что-нибудь, но это не так. Кроме того, мой метод percolateDown изначально не давал мне правильного вывода, но изменения некоторых логических операторов в конечном итоге работали.

// File: main.cpp

#include <iostream>
#include <sstream>
using namespace std;

using HeapType = string;
const int HEAP_SIZE = 100;
void heapify(HeapType heap[], const int length);
void percolateDown(int parentIndex, HeapType heap[], const int length);
void swap(HeapType heap[], const int index1, const int index2);
void displayHeap(const string& label, const HeapType heap[], const int length);


int main() {
    string heap[HEAP_SIZE] = { "Adam", "John", "Mary", "Barry", 
                               "Terry", "Michael", "Trent", "Grace", "Annabel", "Rose"
                             };
    int length = 10;

    displayHeap("Original array: ", heap, length);
    heapify(heap, length);
    displayHeap("\n      Min heap: ", heap, length);

    cout << endl;
    return 0;
}// end main()



void heapify(HeapType arr[], const int length) {
    /* TODO (1):
     * Rebuilt into a min heap.
     */
      for (int i = (length / 2) - 1; i >= 0; i--) 
        percolateDown(i, arr, length); 


}// end heapify()


void percolateDown(int parentIndex, HeapType heap[], const int length) {
    /* TODO (2):
     * Starting at the specified index, rebuilt the min heap.
     */
     int min;
     int leftChild;
     int rightChild;

     while(parentIndex < length){
        min = parentIndex;
        leftChild =  2*parentIndex+1;
        rightChild =  2*parentIndex+2;

        if(heap[rightChild] <= heap[leftChild] || leftChild > length ){
            min = rightChild;  
        }

        if(heap[leftChild] < heap[rightChild]  || rightChild >= length  ){
            min = leftChild;  
        }

        if(min < length && heap[parentIndex] > heap[min] && min != parentIndex){
            swap(heap, parentIndex, min);  
        }

        parentIndex++;
     }

}// end percolateDown()


void swap(HeapType heap[], const int index1, const int index2) {
    HeapType hold = heap[index1];
    heap[index1] = heap[index2];
    heap[index2] = hold;
}// end swap()


void displayHeap(const string& label, const HeapType heap[], const int length) {
    ostringstream oss(label + "[ ]");

    if ( length ) {
        oss << label << "[ ";

        for (int i = 0; i <= length - 1; i++) {
            oss << heap[i] << ", ";
        }
        oss.seekp(-2, ios::end);
        oss << " ]";
    }    

    cout << oss.str();
}// end displayHeap()

Это ожидаемый результат, который я правильно выполнил, но я предполагаю, что ошибся на пути к неправильному получению.

Оригинальный массив: [Адам, Джон, Мэри, Барри, Терри, Майкл, Трент, Грейс, Аннабель, Роуз] Мин куча: [Адам, Аннабель, Мэри, Барри, Роуз, Майкл, Трент, Грейс, Джон, Терри]

Ошибка, которую дает мне онлайн-грейдер, - FAILED: heapify () преобразует массив в правильную минимальную кучу.

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