题目描述
输入 nn(1 \le n < 50000001≤n<5000000 且 nn 为奇数)个数字 a_iai(1 \le a_i < {10}^91≤ai<109),输出这些数字的第 kk 小的数。最小的数是第 00 小。
请尽量不要使用 nth_element
来写本题,因为本题的重点在于练习分治算法。
输入格式
无
输出格式
无
输入输出样例
输入 #1复制
5 1 4 3 2 1 5
输出 #1复制
2
#include <iostream>
using namespace std;
const int N=5e6+10;
long long int q[N];
long long int quick_sort(int l,int r,int k)
{
if(l==r) return q[l];
long long int x=q[(l+r)/2],t;
int i=l-1,j=r+1;
while(i<j)
{
while(q[++i]<x);
while(q[--j]>x);
if(i<j)
{
t=q[i];
q[i]=q[j];
q[j]=t;
}
}
if(k<=j) return quick_sort(l,j,k);
else return quick_sort(j+1,r,k);
}
int main()
{
int n,k,i;
scanf("%d%d",&n,&k);
for(i=0;i<n;i++) scanf("%lld",&q[i]);
long long int x=quick_sort(0,n-1,k);
printf("%lld ",x);
return 0;
}
错误点:1、if(k<=j) quick_sort(l,j,k); else quick_sort(j+1;r,k);
这个j很关键。
2、循环后i和j的位置:(1) i=j; (2)i=j+1;