include
using namespace std;
int x=100;
int rr(int b[],int left,int right)
{
int m=left,n=right+1;
int h=b[left];
while(1)
{
while(b[++m]<h&&m<right);
while(b[--n]>h);
if(m>=n)
{
break;
}
int change=b[m];
b[m]=b[n];
b[n]=change;
}
b[left]=b[n];
b[n]=h;
return n;
}
void sort(int b[],int left,int right,int pd)
{
//cout<<left<<" "<<right<<endl;
if(left>=right)
{x=b[right];
return;}
int new1=rr(b,left,right);
//cout<<new1<<" "<<b[new1]<<endl<<endl;
//cout<<new1<<endl;
//cout<<b[new1]<<endl;
if(new1==pd-1)
{
x=b[new1];
return;
}
else if(new1>pd-1)
{
sort(b,left,new1-1,pd);//new1-1
}
else
{
sort(b,new1+1,right,pd);
}
}
int main()
{
int a;
int pd;
int b[100000];
cin>>a;
cin>>pd;
for(int y=0;y<a;y++)
{
cin>>b[y];
//cout<<b[y]<<endl;
}
sort(b,0,a-1,pd);
cout<<x<<endl;
/for(int y=0;y<a;y++)
{
cout<<b[y]<<" ";
}/
return 0;
}
1、首先选取数组第一个元素作为基准,将数组划分为两部分:左部分的元素是小于基准的,右部分的元素是大于等于基准的,最后返回基准的最终位置。然后进行递归查找,先计算这个基准是当前数组第几小的元素,若刚好等于k,就返回主元;若小于k,递归查找左子数组;若大于k递归查找右子数组。直至return一个程序要求的值——pd-1,返回该元素。
2、最好时间复杂度:O(n)
最坏时间复杂度:O(n²)
3、分治算法就是把一个问题分成若干个独立并且求解方法相同的子问题,一般通过递归求其最优解,再合并子问题。这个算法可以让解决问题变得更简单,当然不是所有问题都可以使用,需要具体分析。