Wie implementiert man einen max-heap

Habe ich den code zum erstellen eines max-Heaps, aber es hält bei der Rückkehr das gleiche array gebe ich es. Ich bin sicher, dass es ein geringfügiger Fehler, aber ich kann nicht scheinen, um es herauszufinden. Jede Hilfe ist willkommen.

Kompilierbare Beispiel-code:

#include <iostream>
#include <cmath>

class Heaparr {
public:
    Heaparr();
    void insert(int da);
    int getLeft(int i) { return 2 * i; }
    int getRight(int i) { return (2 * i) + 1; }
    int getParent(int i) { return i / 2; }
    int getMax() { return maxHeap[0]; }
    void print();
    void reheap(int num);
    void makeArray();
    void Build_Max_Heap(int maxHeap[], int heap_size);
    void Max_Heapify(int heapArray[], int i, int heap_size);
    void heapSort(int heapArray[]);

private:
    int size;
    int* maxHeap;
    int index;
    int i;
};

Heaparr::Heaparr() {
    maxHeap = nullptr;
    size = 0;
}

void Heaparr::insert(int da) {
    size++;
    int* tmp = new int[size];

    for (int i = 0; i < size - 1; i++) {
        tmp[i] = maxHeap[i];
    }

    tmp[size - 1] = da;
    delete[] maxHeap;
    maxHeap = tmp;
}

void Heaparr::heapSort(int maxHeap[]) {
    int heap_size = size;
    int n = size;
    int temp;

    Build_Max_Heap(maxHeap, heap_size);

    for (int i = n - 1; i >= 1; i--) {
        temp = maxHeap[0];
        maxHeap[0] = maxHeap[i];
        maxHeap[i] = temp;

        heap_size = heap_size - 1;
        Max_Heapify(maxHeap, 0, heap_size);
    }

    for (int i = 0; i < 8; i++) {
        std::cout << maxHeap[i] << std::endl;
    }
}

void Heaparr::Build_Max_Heap(int maxHeap[], int heap_size) {
    int n = size;
    for (int i = floor((n - 1) / 2); i >= 0; i--) {
        Max_Heapify(maxHeap, i, heap_size);
    }
    return;
}

void Heaparr::Max_Heapify(int heapArray[], int i, int heap_size) {
    //int n = size;
    int largest = 0;
    int l = getLeft(i);
    int r = getRight(i);

    if ((l <= heap_size) && (heapArray[l] > heapArray[i])) {
        largest = l;
    } else {
        largest = i;
    }

    if ((r <= heap_size) && (heapArray[r] > heapArray[largest])) {
        largest = r;
    }

    int temp;
    if (largest != i) {
        temp = heapArray[i];
        heapArray[i] = heapArray[largest];
        heapArray[largest] = temp;

        Max_Heapify(heapArray, largest, heap_size);
    }
    return;
}

int main(int argc, char* argv[]) {
    int hArray[8] = {5, 99, 32, 4, 1, 12, 15, 8};
    Heaparr t;
    t.heapSort(hArray);
    for (auto v : hArray) {
        std::cout << v << ", ";
    }
    std::cout << std::endl;
}
Haben Sie ging durch den code in einem debugger? Was war das Ergebnis?
Statt zu schreiben Ihre eigenen Haufen, warum nicht make_heap? cplusplus.com/reference/algorithm/make_heap
Die .h-Datei und die fehlenden Funktionen getLeft und getRight wäre gut zu haben. Eine kompilierbare Beispiel wäre toll.
Ich fügte hinzu, die .h-Datei
In Ihrer Funktion einfügen, nachdem Sie "da" als das Letzte element in temp, fügen Sie nach oben in die richtige Stellung. Da, das ist max. heap, müssen Sie vergleichen mit Eltern bei maxHeap[Größe/2] und wenn größere tauschen Sie die beiden. Ich sehe nicht, wie Sie dies tun.

InformationsquelleAutor user3316874 | 2014-07-31

Schreibe einen Kommentar