利用快速排序的方法寻找第k小的数据,该方法的时间复杂度平均为O(n),可以满足一般情况下的查找算法
#include <stdio.h>
// res代表开始查找的元素的地址,n代表查找的范围,nTh代表查找该范围内的第nTh小的元素
int FindNth(int*res,int n,int nTh)
{
//如果查找的范围为1,直接返回该元素
if (n<=1)
{
return *res;
}
int i=0,j=n-1;
int temp=*res;
while (i<j)
{
while (res[j]>=temp && i<j)
{
j--;
}
if (i<j)
{
res[i]=res[j];
}
while(res[i]<=temp && i<j)
{
i++;
}
if (i<j)
{
res[j]=res[i];
}
}
res[i]=temp;
//如果刚好找到该元素则直接返回
if (i==nTh-1)
{
return res[i];
}
//如果该元素在右边(即是元素值较大的那边,修改查找范围,在该范围内寻找第nTh-i-1小的元素)
if (i<nTh-1)
{
return FindNth(res+i+1,n-i-1,nTh-i-1);
}
//修改查找范围,寻找第nTh小的元素
else
{
return FindNth(res,i,nTh);
}
}
int main()
{
int n,data[1000],nTh;
scanf("%d%d",&n,&nTh);
for (int i=0;i<n;i++)
{
scanf("%d",&data[i]);
}
printf("%d\n",FindNth(data,n,nTh));
}