从一个长度为n的无序数组中,找到第k小的那个数,被称为k-select问题。我们经常见到的问题:找到中位数,找到第二个大的数,都是这个问题的特例。
算法的复杂度是O(20n),当选择为5个数为一个小集合时。
OJ风格的完整代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define Q 5
#define LOCAL
int A[1001];
int n;
int k;
int cmp(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
int trivivalSelect(int *A, int n, int k) {
int temp[1001];
memset(temp, 0, sizeof(int)*1001);
memmove(temp, A, sizeof(int)*n);
qsort(temp, n, sizeof(int), cmp);
printf("trivivalSelect: %d\n", temp[k]);
return temp[k];
}
int kselect(int* A, int n, int k) {
if (n < Q) {
return trivivalSelect(A, n, k);
}
int mid[1001];
int temp[1001];
memset(mid, 0, sizeof(int)*1001);
int i = 0;
int c = 0;
while (i < n) {
int count = (n - i < Q ? n - i : Q);
memset(temp, 0, sizeof(int)*1001);
memmove(temp, A + i, sizeof(int)*count);
qsort(temp, count, sizeof(int), cmp);
mi

本文介绍了如何在O(20n)的时间复杂度内解决k-select问题,即从无序数组中找到第k小的数。中位数和第二大数的查找作为此问题的特例被提及。代码实现读取输入数组的大小n和位置k,然后输出第k小的数。
最低0.47元/天 解锁文章
19

被折叠的 条评论
为什么被折叠?



