/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param input int整型一维数组 
 * @param inputLen int input数组长度
 * @param k int整型 
 * @return int整型一维数组
 * @return int* returnSize 返回数组行数
 */

#include <stdio.h>
#include <stdlib.h>

// 交换两个整数的函数
void swap(int* a, int* b) {
    int temp = *b;
    *b = *a;
    *a = temp;
}

// 大顶堆的调整函数,用于维护大顶堆的性质
void maxHeapify(int* input, int i, int heapSize) {
    int left = 2 * i + 1; // 左子树索引
    int right = 2 * i + 2; // 右子树索引
    int largest = i;
    // 比较左子节点和当前节点,找到较大值的索引
    if(left < heapSize && input[left] > input[largest]) {
        largest = left;
    }
    if(right < heapSize && input[right] > input[largest]) {
        largest = right;
    }
    // 如果最大值不是当前节点,进行交换并继续调整堆
    if(largest != i) {
        swap(&input[i], &input[largest]);
        maxHeapify(input, largest, heapSize);
    }
}

void buildMaxHeap(int* input, int heapSize) {
    for(int i = heapSize / 2 - 1; i >= 0; i--) {
        maxHeapify(input, i, heapSize);
    }
}

int* GetLeastNumbers_Solution(int* input, int inputLen, int k, int* returnSize ) {
    // write code here
    int* result = (int*)malloc(k * sizeof(int));
    if(k == 0 || inputLen == 0) {
        *returnSize = 0;
        return result;
    }
    // 先构建一个包含数组前k个元素的大顶堆
    buildMaxHeap(input, k);
    // 遍历剩余的元素
    for(int i = k; i < inputLen; i++) {
        // 如果当前元素小于堆顶元素,将堆顶元素替换为当前元素,并调整堆
        if(input[i] < input[0]) {
            input[0] = input[i];
            maxHeapify(input, 0, k);
        }
    }

    for(int i = 0; i < k; i++) {
        result[i] = input[i];
    }
    *returnSize = k;
    return result;
}