преобразование max-heap в min-heap с помощью heapfy
Я пытаюсь заполнить максимальную кучу, я попал в минимальную кучу. По какой-то причине я не получаю ожидаемого результата.
Я построил свою максимальную кучу, и содержимое ее массива отображается, как ожидалось:
60 50 30 20 40 10
При попытке скопировать указанный выше массив и преобразовать его в минимальную кучу желаемый результат:
10 20 30 60 50 40
Однако результат, который я получаю:
10 20 60 50 40 30
вот мои функции:
struct _heap
{
int max; //array max
int pos; //current position
int* priority; //array gets initialized after.
};
typedef struct _heap heap_t;
void heapify_min(heap_t* h, int father)
{
int smallest = father;
int left = 2 * father + 1;
int right = 2 * father + 2;
if (left < h->pos && h->priority[left] < h->priority[smallest) {
smallest = left;
}
if (dir < h->pos && h->priority[right] < h->priority[smallest])
smallest = right;
if (smallest != father) {
swap(father,smallest,h->priority);
heapify_min(h,left);
}
}
void swap(int a, int b, int *v)
{
int f = v[a];
v[a] = v[b];
v[b] = f;
}
void build_heap(heap_t* h)
{
int n = h->pos;
int i2 = (n/2) -1;
int i;
for (i = i2;i>=0;i--) {
heapify_min(h,i);
}
}
Любые идеи были бы действительно полезны.
1 ответ
Привет, я думаю, что ваша максимальная куча не работает должным образом, потому что на выходе: 60 50 30 20 40 10 Я вижу, что 40 - это второе число с правой стороны в массиве.
Сравните свой код с моим (ниже рабочий код для min_heap). Есть 3 проблемы:
В функции heapify_min, когда вы вызываете функцию рекурсивно, вы должны использовать наименьшую не оставшуюся переменную .
операторы сравнения значений в MIN HEAP должны быть> (больше) вместо <(меньше)
Функция build_heap верна, но это должна быть самая первая перестановка массива. И после этой первой перестановки массива (первого создания максимальной кучи) вы должны поменять местами первый и последний элемент в массиве. После этого начального свопа вы продолжаете использовать функцию heapify, но каждое последующее создание максимальной кучи, замена значений в поддеревьях (во время рекурсивного вызова) и замена первого элемента последним выполняется в цикле до тех пор, пока не останется только один узел.
Вот код:
void heapify(int arr[], int n, int i)
{
int smallest = i;
int l = 2 * i + 1;
int r = 2 * i + 2;
// If left child is larger than root
if (l < n && arr[l] > arr[smallest])
smallest = l;
// If right child is larger than largest so far
if (r < n && arr[r] > arr[smallest])
smallest = r;
// If largest is not root
if (smallest != i) {
//swap
int backUp = arr[i];
arr[i] = arr[smallest];
arr[smallest] = backUp;
// Recursively call on heapify function
heapify(arr, n, smallest);
}
}
void heapSort(int arr[], int n)
{
// Build heap (rearrange array)
for (int i = n / 2 - 1; i >= 0; i--)
heapify(arr, n, i);
// One by one extract an element from heap
for (int i = n - 1; i > 0; i--) {
// Swap root node with last node in array (WARNING: last node don't have to be
necessarily smallest one)
int backUp = arr[0];
arr[0] = arr[i];
arr[i] = backUp;
// call max heapify on the reduced heap
heapify(arr, i, 0);
}
}
/* A utility function to print array of size n */
void printArray(int arr[], int n)
{
for (int i = 0; i < n; ++i)
printf("%d ", arr[i]);
printf("\n");
}