У меня проблема с домашней работой, когда я пишу функции 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 () преобразует массив в правильную минимальную кучу.