5067 Problem A 求第k大数

问题 A: 求第k大数

时间限制: 1 Sec  内存限制: 128 MB

题目描述

给定一个长度为n(1≤n≤1,000,000)的无序正整数序列,以及另一个数k(1≤k≤1,000,000)(关于第k大的数:例如序列{1,2,3,4,5,6}中第3大的数是4。)

输入

第一行两个正整数m,n。

第二行为n个正整数。

输出

第k大的数。

样例输入

6 3
1 2 3 4 5 6

样例输出

4

经验总结

其实,这一题方法有很多,比如,树状数组,还有分块思想都可以解决,这里是我没有看到后面的内容之前,借鉴的网上大佬的算法(应该是,忘得差不多了),思想并不难,就是快速排序的变种,区别在于,快速排序每次都将数组下标为0的元素当做 ” 哨兵 “ 而这里采用随机算法进行随机选择,这样就平衡了最坏情况与最好情况之间的差距,算法详情请看代码~

AC代码

#include 
#include 
#include 
#include 
using namespace std;
int no[1000010];
int randPartition(int a[],int left,int right)
{
	
	int p=round(1.0*rand()/RAND_MAX*(right-left)+left);
	swap(a[left],a[p]);
	int temp=a[left];
	while(lefttemp)	right--;
		a[left]=a[right];
		while(left

 

你可能感兴趣的:(codeup)