从一个长度为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);
memmov