786.第k个数——快排的应用
#include<stdio.h>
#define N 100010
int a[N];
int quick_sort(int a[],int l,int r,int k){//这个函数给一个下标范围内排序 不要默认是从0开始
int i=l-1,j=r+1,x=a[l+r>>1];//x是数值中的某个数 不是单单下标的中点
if(l==r) return a[l];//判断条件 当只有一个数的时候推出
while(i<j){
do i++; while(a[i]<x);
do j--; while(a[j]>x);
if(i<j){
int h;
h=a[i];
a[i]=a[j];
a[j]=h;
}
// else break;
}
//通过j来区分左右边
int sl=j-l+1;
//sl指的是一次排序的范围 我刚刚开始用的是i来判断就是默认从0开始排序了这是错误的想法
if(sl>=k) return quick_sort(a,l,j,k); //如果在排序范围内
else return quick_sort(a,j+1,r,k-sl);//超出范围的话 k就得减去排序范围
}
int main(){
int n,k;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int tar=quick_sort(a,0,n-1,k);
printf("%d",tar);
// for(int i=0;i<n;i++)printf("%d ",a[i]);
}
;i<n;i++)printf("%d ",a[i]);
}