题目:
给出一个O(n)时间的算法,在给定一个有n个不同数字的集合S以及一个正整数k<=n后,它能确定出S中最接近其中位数的k个数
思考:
step1:求出数组的中位数的值O(n)
step2:计算数组每个数与中位数差的绝对值,存于另一个数组B中O(n)
step3:求出数组B中第k小的数ret O(n)
step4:计算数组S中与ret差的绝对值小于ret的数并输出O(n)
其中,step4也可以通过划分的方法找出数组S中与ret差的绝对值小于ret的数
代码:
#include <iostream>
using namespace std;
int length_A;
void Print(int *A)
{
int i;
for(i = 1; i <= length_A; i++)
cout<<A[i]<<' ';
cout<<endl;
}
/*************最坏情况线性时间的选择**************************************************/
//已经出现很多次了,不解释
int Partition(int *A, int p, int r)
{
int x = A[r], i = p-1, j;
for(j = p; j < r; j++)
{
if(A[j] <= x)
{
i++;
swap(A[i], A[j]);
}
}
swap(A[i+1], A[r]);
return i+1;
}
int Select(int *A, int p, int r, int i);
//对每一