/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @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;
}