2024-03-19 02:45:09 +08:00

82 lines
1.8 KiB
C

#include <stdio.h>
#include <malloc.h>
//面试题 17.14. 最小K个数
//https://leetcode-cn.com/problems/smallest-k-lcci/
void swap(int *array, int pos, int pos2)
{
int tmp = array[pos];
array[pos] = array[pos2];
array[pos2] = tmp;
}
int *topk(int *arr, int start, int end, int k, int *returnSize)
{
int q = start, p = end + 1, mid = (end - start) / 2 + start, flag = 0;
if (arr[start] > arr[end])
{
swap(arr, start, end);
}
if (arr[mid] > arr[end])
{
swap(arr, mid, end);
}
if (arr[start] > arr[mid])
{
swap(arr, mid, end);
}
flag = arr[mid];
swap(arr, start, mid);
while (1)
{
while (arr[++q] < flag)
;
while (arr[--p] > flag)
;
if (q > p)
{
break;
}
swap(arr, q, p);
}
swap(arr, start, p);
if (p > k)
{
//大于k,搜索左边
topk(arr, start, p - 1, k, returnSize);
}
else if (p < k)
{
//小于k,搜索右边
topk(arr, p + 1, end, k, returnSize);
}
else
{
//等于k,返回
return arr;
}
return arr;
}
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int *smallestK(int *arr, int arrSize, int k, int *returnSize)
{
if (k == arrSize)
{
return arr;
}
*returnSize = k;
topk(arr, 0, arrSize - 1, k, returnSize);
return arr;
}
int main()
{
int arr[] = {4, -5051, 6, 10156, 1, -39670, 2, -686, -19101, 42719, 8216, -56, -30716, -6, 0, -14, 97, -37023, 0, -28, 5094, 884, -508, 36504, 47475, 8, 37603, 2, -5021, -65, 0, 3229, 6068, 7, 5534, -577, -184, 92, 4, -797, -126, 460};
int ret = 0;
smallestK(arr, sizeof(arr) / sizeof(int), 34, &ret);
}