Bawiłem się z niektórymi algorytmami w podręczniku Intro to Algorithms, w szczególności próbuję uzyskać Binary Heap do pracy w 100% poprawnie. Mam dziwne przeczucie, że przykład, z którym pracuję, nie jest poprawny i zastanawiałem się, czy ktoś może pomóc mi wskazać właściwy kierunek.Wyniki algorytmu Max Heapify
Biorąc pod tablicą
int[ ] arr = { 1, 2, 3, 4, 7, 8, 9, 10, 14, 16 };
Wynik dostaję od MaxHeapify jest
[ 16, 14, 9, 10, 7, 8, 3, 1, 4, 2 ]
Jednak po wykonaniu pewnej liczby wyszukiwań Google, stwierdziliśmy, że ludzie, którzy używają dokładnie tej tablicy jako przykład oczekiwać wynik będzie następujący:
[ 16, 14, 10, 8, 7, 9, 3, 2, 4, 1 ]
Co mnie myli, to wynik, że mój MaxHeapify metoda daje satysfakcję właściwości Heap, ale jest inna niż oczekiwana. Poniżej znajduje się moja implementacja w języku Java:
public static void BuildMaxHeap(int[ ] arr)
{
for(int i = (int)Math.floor(arr.length - 1); i >= 0; i--)
MaxHeapify(arr, i);
}
public static void MaxHeapify(int[ ] arr, int i)
{
int left = 2 * i + 1;
int right = 2 * i + 2;
int largest = i;
if(left < arr.length && arr[ left ] > arr[ largest ])
largest = left;
if(right < arr.length && arr[ right ] > arr[ largest ])
largest = right;
if(largest != i)
{
int temp = arr[ i ];
arr[ i ] = arr[ largest ];
arr[ largest ] = temp;
MaxHeapify(arr, largest);
}
}
Oba te są prawidłowe stosy. Wydajesz się, że robisz maksymalny zastrzyk nieco inaczej. –
Dlaczego używasz 'flooring'' length'? To jest nop. – jpm
Jpm, w podręczniku jest dowód, który mówi, że każdy element w tablicy podrzędnej z 'A [(podłoga (n/2) + 1) ... n]' jest już liściem, a zatem każdy jest 1 -elementowa kupa. – wmarquez