对于给定该元素的n个元素的数组a[0:n-1],要从中找出第K小的数
问题思路:很容易想到该问题的思路为对该数组进行排序,然后选择第k小,但复杂度较高,即使使用较好的排序方法,算法的时间复杂性也为O(nlogn),本题可借助快速排序的思想进行求解,我们只需要确定该元素是不是第K小即可,无需对整个数组进行排序,选择轴值进行交换,看轴值前的个数是否为K-1个,而无需关心其顺序(因为轴值前的都比轴值小,我们只要确定大小即可,无需知道顺序)。
算法实现如下:
#include<iostream>
using namespace std;
int a[100];
int select(int left,int right,int k);
int main()
{
//数据准备阶段
int n,k;
cin>>n;
cin>>k;
for (int i = 0; i < n; i++)
{
cin>>a[i];
}
//算法核心
cout<<select(0,n-1,k)<<endl;
system("pause");
}
int select(int left,int right,int k)
{
if (left>=right)
{
return a[left];
}
int start = left+1;
int end = right;
int p = a[left];
while(true)
{
while (a[start]<p)
{
start++;
}
while (a[end]>p)
{
end--;
}
if (start>=end)
{
break;
}
std::swap(a[start],a[end]);
}
if (end-left+1 == k)
{
return p;
}
else
{
a[left] = a[end];
a[end] = p;
if (end-left+1<k)
{
return select(end+1,right,k-end+left-1);
}
else
{
return select(left,end-1,k);
}
}
}