在《算法导论》第3版习题习题9.3-7提到,设计一个O(n)时间的算法,对于一个给定的包含n个互异元素的集合S和一个正整数 k<=n,该算法能够确定S中最接近中位数的k个元素。
步骤如下:
1: select A数组得到其中位数nmid,其下标为imid
2: 计算A中每个数到中位数的差值作为数组dis, 并拷贝到数组dis_copy
3: select dis_copy数组得到第k小的数nkmid
4: 遍历数组dis, 获取k个值小于等于nkmid的数
代码如下
int partition(int A[], int p, int r)
{
int x = A[r];
int i = p - 1;
for (int j = p; j < r; ++j)
{
if (A[j] <= x)
{
++i;
swap(A[i], A[j]);
}
}
swap(A[i