时间复杂度:O(n)
代码:
#include <iostream>
#define MAX_SIZE 10000
using namespace std;
int a[MAX_SIZE]={0};
int FindKth(int a[],int l,int r,int k)
{
int i=l,j=r;
int base=a[l];
if (l<=r)
{
while (i!=j)
{
while (base<=a[j]&&i<j) j--;
while (base>=a[i]&&i<j) i++;
if (i!=j)
{
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
int t=a[l];
a[l]=a[i];
a[i]=t;
if (i-l+1==k) return a[i];
else if (i-l+1>k) return FindKth(a,l,i-1,k);
else if (i-l+1<k) return FindKth(a,i+1,r,k-(i-l+1));
}
}
int main()
{
int k;int n;
while (cin>>n>>k)
{
for (int i=1;i<=n;i++)
cin>>a[i];
cout<<FindKth(a,1,n,k);
cout<<endl;
}
return 0;
}
这个寻找第k小的数也算是快速排序的一个副产物吧。但是如果要找第k大的数怎么找呢,是不是需要重新写个新的函数呢?显然不是的,寻找第k大的数不就是找第(n-k)小的数吗!
对于代码的分析都已经写在注释里面了,其中的个数不是太好理解,不过将一组数分成3部分,一部分一部分地求,最后肯定能求出来的。