题目描述
输入 �n(1≤�<50000001≤n<5000000 且 �n 为奇数)个数字 ��ai(1≤��<1091≤ai<109),输出这些数字的第 �k 小的数。最小的数是第 00 小。
请尽量不要使用 nth_element
来写本题,因为本题的重点在于练习分治算法。
输入格式
无
输出格式
无
输入输出样例
输入 #1复制
5 1 4 3 2 1 5
输出 #1复制
2
#include<bits/stdc++.h>
using namespace std;
/*struct node{
string na;
double n,m;
}p[101];*/
int ch[5000005],n,m;
void qsort(int l,int r){
//l<j<<i<<r
int i=l,j=r,mid=ch[(l+r)/2];
do{
while(ch[j]>mid){
j--;
}
while(ch[i]<mid){
i++;
}
if(i<=j){
swap(ch[i],ch[j]);
i++;
j--;
}
}while(i<=j);
if(m<=j)qsort(l,j);
else if(m>=i)qsort(i,r);
else {
cout<<ch[m];
exit(0);
}
}
int main(){
//int n;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&ch[i]);
}
qsort(0,n-1);
}
今天了解到三个方法
number1:sort(函数名,函数名加数值);
number2:nth_element(函数名,函数名+待查数值,函数名+待查范围);
number3:分治思想:划区间,left<j<i<right;也就是二分的思路,上面所提到的代码