【洛谷 P1923】 【分治】 求第k小的数

【洛谷 P1923】 【分治】 求第k小的数

题目

在这里插入图片描述


解题思路

类似快排的思想
但不需要重复怎么多次
例:找第k小
如果当前左区间的右边界大于k
就可以不在排序左区间了
因为左区间的数都比第k小数小


代码

#include<iostream>
#include<cstdio>
#include<stdlib.h>
using namespace std;
int n,k,a[5000010];
void qsort(int l,int r)
{
    
     
	 if (l>=r) return;  
	 int x=l,y=r,mid=a[(l+r)/2];
	 do{
    
    
	 	while (a[l]<mid) l++;
	 	while (a[r]>mid) r--;
	 	if (l<=r) 
	 	{
    
    
	 	   int c=a[l];
		   a[l]=a[r];
		   a[r]=c;
		   l++,r--;	
		}
	 }while (l<=r);
	 if (r>=k)
	    qsort(x,r);
	    if (l<=k) 
		   qsort(l,y); 
		   else {
    
    
		   	     printf("%d ",a[k+1]);
		   	     exit(0);
		   }
}
int main()
{
    
    
	scanf("%d%d",&n,&k);
	for (int i=1;i<=n;i++)
	    scanf("%d",&a[i]);
	qsort(1,n);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45621109/article/details/115415910