编辑代码

#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;
}