给定一个数组和一个k,输出最小的k个数字。
这个问题有多重解法,譬如:
1、sort, top K,时间复杂度O(nlogn)
2、小顶堆排序,pop+调整k次,时间复杂度O(n+klogn)。
3、选择排序,每次选min,swap到头部时间复杂度O(nk)。
这里写下选择排序这个。
#include <stdio.h>
void select_min(int* arr, int n, int k)
{
int i, j, tmp;
int min,minP;
for(i=0; i<k; i++)
{
min = arr[i];
minP = i;
for(j=i+1; j<n; j++)
{
if(arr[j]<arr[minP])
{
minP = j;
min = arr[j];
}
}
if(minP!=i)
{
tmp = arr[minP];
arr[minP] = arr[i];
arr[i] = tmp;
}
}
// Print min k
for(i=0;i<k;i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, -1};
int k = 3;
select_min(arr, sizeof(arr)/sizeof(int), 3);
return 0;
}