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
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.
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Machte ich einige Feste der code (ich versuche nicht zu viel verändert, der ursprüngliche code):
getLeft
,getRight
undgetParent
Formeln waren falsch (Beispiel: wenn Siei == 0
Kinder müssen 1 und 2 und mit dem code sind 0 und 1. Der return-Typ war auch falsch, sollteint
(array-index).int[]
außer ininsert
und diemember variable
sinddouble[]
änderten, umint[]
, wenn Sie sich wieder alle zu Doppel -std::swap
für swap-Werte in das array.Hinweise:
maxHeap
, weil alle Methoden, außergetMax
undinsert
mit dem array-parameter übergeben und nicht die variable (vielleicht sollte man die Initialisierung im Konstruktor oder inheapSort
Methode.std::vector
stattC Array
Code:
Ausgabe:
99, 32, 15, 12, 8, 5, 4, 1,
Getestet GCC 4.9.0 mit C++11
InformationsquelleAutor NetVipeC
Wenn Sie bereit sind, zu prüfen, alternative Implementierungen, dann ist hier eine:
Und hier ist ein Beispiel:
Beschreibung:
Diese Klasse speichert bis zu
N
Elemente des TypsT
Es ermöglicht das hinzufügen eines Elements oder die Extraktion die beste Position
Unterstützten Operationen werden durchgeführt bei
O(log(n))
, won
ist die aktuelle Anzahl der ElementeBemerkungen:
T
ist bestimmt bei der Deklaration undN
ist bestimmt bei der InitialisierungSinne von "best", entweder minimal oder maximal ist, ist bestimmt bei der Deklaration
Zur Unterstützung
Heap<MIN,T>
undHeap<MAX,T>
eine der folgenden Optionen muss tragfähig sein:bool operator<(T,T)
undbool operator>(T,T)
bool T::operator<(T)
undbool T::operator>(T)
T::operator P()
, woP
ist eine Art, für die eine der oben genannten Optionen ist möglichInformationsquelleAutor barak manos