题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,
则最小的4个数字为1,2,3和4。
首先随即选择一个数组的的元素,比这个元素大的(小的)放到他的后面,比这个元素大的放到他的后面(前面),时间复杂度要求为O(n)
int TiaoZheng(int a[],int len)
{
srand(time(NULL));
int idx=rand()%(len+1);
Swap(a[idx],a[len]);
int i=-1;
for(int j=0;j<=len;j++)
{
if(a[j]<a[len])
{
Swap(a[++i],a[j]);
}
}
Swap(a[++i],a[len]);
return i;
}
int TiaoZheng(int a[],int len)
{
srand(time(NULL));
int idx=rand()%(len+1);
Swap(a[idx],a[len]);
int i=-1;
for(int j=0;j<=len;j++)
{
if(a[j]>a[len])
{
Swap(a[++i],a[j]);
}
}
Swap(a[++i],a[len]);
return i;
}
如上述算法成功之后。就解决了很多问题。
如下代码:
void Swap(int& i,int& j)
{
int temp=i;
i=j;
j=temp;
}
int TiaoZheng(int a[],int len)
{
srand(time(NULL));
int idx=rand()%(len+1);
Swap(a[idx],a[len]);
int i=-1;
for(int j=0;j<=len;j++)
{
if(a[j]>a[len])
{
Swap(a[++i],a[j]);
}
}
Swap(a[++i],a[len]);
return i;
}
int getMaxK(int *p,int n,int k)
{
int mid;
if(k<=0)
return -1;
if(n<k)
return -1;
mid=TiaoZheng(p,n-1);
if(mid==n-k)
return p[mid];
else if(mid>n-k)
{
getMaxK(p,mid,mid-(n-k));
}
else if(mid<n-k)
getMaxK(p+mid+1,n-mid-1,k);
}
int main(void)
{
//BiTree p=NULL;
//createBiTree(p);
//std::vector<int> path;
//cout<<"18的路径:"<<endl;
//FindPath(p,18,path,0);
int a[]={3,4,5,6,1,0,-1,19};
for(int i=1;i<=4;i++)
cout<<getMaxK(a,sizeof(a)/sizeof(int),i)<<" ";
return 0;
}