#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void heapify(int *heap, int capacity) {
int lastParentIndex = floor(capacity / 2);
for (int i = lastParentIndex; i > 0; --i) {
int parentIndex = i;
while (parentIndex <= lastParentIndex) {
int leftChildIndex = 2 * parentIndex;
int maxIndex = leftChildIndex;
if ((leftChildIndex + 1 <= capacity) && (heap[leftChildIndex + 1] > heap[maxIndex])) {
maxIndex = leftChildIndex + 1;
}
if (heap[parentIndex] < heap[maxIndex]) {
int temp;
temp = heap[parentIndex];
heap[parentIndex] = heap[maxIndex];
heap[maxIndex] = temp;
parentIndex = maxIndex;
}
else {
break;
}
}
}
}
int* createHeap(int arr[], int length, int *capacity) {
*capacity = length;
int *heap = (int*)malloc((*capacity + 1) * sizeof(int));
for (int i = 0; i < length; ++i) {
heap[i + 1] = arr[i];
}
heapify(heap, *capacity);
return heap;
}
void printHeap(int *heap, int capacity) {
for (int i = 1; i <= capacity; ++i) {
printf("%d ", heap[i]);
}
printf("\n");
}
int main() {
int arr[] = {2, 9, 7, 6, 5, 8};
int length = sizeof(arr) / sizeof(int);
int capacity;
int *heap = createHeap(arr, length, &capacity);
printHeap(heap, capacity);
free(heap);
printf("\n");
int arr1[] = {20, 23, 11, 28, 2, 30};
int length1 = sizeof(arr) / sizeof(int);
int capacity1;
int *heap1 = createHeap(arr1, length1, &capacity1);
printHeap(heap1, capacity1);
free(heap1);
return 0;
}