/***************************************
*@time 2016/09/25 23:32
*@palce dhu.13#.5005
*******************************************************/
#include<cstdio>
#include<iostream>
using namespace std;
/***********************************
*@函数名 findSmallerKNuns
*@parameter int* nums 数组
*@parameter beginIndex,endIndex,K 搜索开始下标,搜索结束下标,最小数的个数
*@description 利用了快速排序的思想,分治求得最小的K个数
*********************************************************************/
bool findSmallerKNuns(int *nums,int beginIndex,int endIndex,int K)
{
if(K>endIndex)
{
printf("K is too bigger\n");
return false;
}
int l=beginIndex;
int r=endIndex-1;
int flagIndex=beginIndex;
int flag=nums[flagIndex];
while(l<r)
{
while(l<r&&nums[r]>=flag) r--;
while(l<r&&nums[l]<=flag) l++;
if(l<r)
{
int tmp=nums[l];
nums[l]=nums[r];
nums[r]=tmp;
}
else if(flagIndex<r)
{
nums[flagIndex]=nums[r];
nums[r]=flag;
}
}
if(K==r)
{
return true;
}
else if(r<K)//现在找到的数不够K个,去右半部分找
{
return findSmallerKNuns(nums,r+1,endIndex,K);
}
else
{
return findSmallerKNuns(nums,beginIndex,r,K);
}
}
int main()
{
int nums[]={1,1,2,2,1,2,1,2,1,2,2};
int K;
scanf("%d",&K);
if(findSmallerKNuns(nums,0,10,K-1))
{
for(int i=0;i<K;i++)
{
printf("%d ",nums[i]);
}
}
else
{
printf("Error: not found!\n");
}
}