题目描述:
查找一个数组的第K小的数,注意同样大小算一样大。
如 2 1 3 4 5 2 第三小数为3。
输入:
输入有多组数据。
每组输入n,然后输入n个整数(1<=n<=1000),再输入k。
输出:
输出第k小的整数。
样例输入:
6
2 1 3 5 2 2
3
样例输出:
3
代码:
void swap(int* e1,int* e2);
int searchk(int arry[],int n,int k);void quicksort(int arry[],int left,int right);
//找出第K小的数
void main()
{
int n,k;
int arry[100];
int i;
int ans;
printf("输入n:");
scanf("%d",&n);
printf("输入数组:");
for(i=0;i<n;i++){
scanf("%d",&arry[i]);
}
printf("输入k:");
scanf("%d",&k);
ans=searchk(arry,n,k);
printf("第K小数为:%d\n",ans);
}
int searchk(int arry[],int n,int k)
{
int i,count=1;
quicksort(arry,0,n-1);
for(i=1;i<n;i++){
if(arry[i-1]!=arry[i]) count++; //不相同的才计数
if(count==k) break;
}
return arry[i];
}
void quicksort(int arry[],int left,int right) //快排
{
if(left>=right) return;
int l=left;
int r=right;
int i=l+1;
int tmp=arry[l];
while(i<=r){
if(arry[i]<tmp) swap(&arry[i],&arry[l++]) ;
if(arry[i]>tmp) swap(&arry[i],&arry[r--]);
if(arry[i]==tmp) i++;
}
quicksort(arry,left,l-1);
quicksort(arry,r+1,right);
}
void swap(int* e1,int* e2)
{
int tmp=*e1;
*e1=*e2;
*e2=tmp;
}