(找第k大的数) 给定一个长度为1,000,000的无序正整数序列,以及另一个数n(1<=n<=1000000),接下来以类似快速排序的方法找到序列中第n大的数(关于第n大的数:例如序列{1,2,3,4,5,6}中第3大的数是4)。

#include <iostream>

using namespace std;

int a[1000001],n,ans = -1;

void swap(int &a,int &b)

{

int c;

c = a; a = b; b = c;

}

int FindKth(int left, int right, int n)

{

int tmp,value,i,j;

if (left == right) return left;

tmp = rand()% (right - left) + left;

swap(a[tmp],a[left]);

value =          ①

i = left;

j = right;

while (i < j)

{

while (i < j &&            ②        ) j --;

if (i < j) {a[i] = a[j]; i ++;} else break;

while (i < j &&            ③        ) i ++;

if (i < j) {a[j] = a[i]; j --;} else break;

}

if (i < n) return  FindKth(               ⑤            );

if (i > n) return                   ⑥

return i;

}

int main()

{

int i;

int m = 1000000;

for (i = 1;i <= m;i ++)

cin >> a[i];

cin >> n;

ans = FindKth(1,m,n);

cout << a[ans];

return 0;

}

答案:

① a[left];

② a[j] < value (或a[j] <= value)

③ a[i] > value (或a[i] >= value)

④ a[i] = value;

⑤ i + 1,right,n

⑥ FindKth(left, i – 1, n);

 该题为noip2008提高组初赛题目

利用的是快排的思想,由大到小排序。

笔者喜欢从小到大的排序,所以将程序修改

 #include <iostream>
#include<stdlib.h>
using namespace std; int a[],n,ans = -;
void swap(int &a,int &b)
{
int c;
c = a; a = b; b = c;
} int FindKth(int left, int right, int n)
{
int tmp,value,i,j;
if (left == right) return left;
tmp = rand()% (right - left) + left;
swap(a[tmp],a[left]);
value = a[left];
i = left;
j = right;
while (i < j)
{
while (i < j && a[j] > value ) j --;//如果 a[j] > value则j左移
if (i < j) {a[i] = a[j]; i ++;} else break;
while (i < j && a[i] < value ) i ++;
if (i < j) {a[j] = a[i]; j --;} else break;
}
a[i] = value;
for (int i=;i<=;i++)cout<<a[i]<<" ";
cout<<endl;
if (i < n) return FindKth( i + ,right,n );
if (i > n) return FindKth(left, i - , n);
return i;//找到第n大的数则返回
} int main()
{
int i;
int m = ;
for (i = ;i <= m;i ++)
cin >> a[i];
cin >> n;
ans = FindKth(,m,m-n+);//找第n大的数 (因为从大到小排序所以为m-n+1)
cout << a[ans];
return ;
}

找第k大的数的更多相关文章

  1. luogu_P1177 【模板】快速排序 (快排和找第k大的数)

    [算法] 选取pivot,然后每趟快排用双指针扫描(l,r)区间,交换左指针大于pivot的元素和右指针小于pivot的元素,将区间分成大于pivot和小于pivot的 [注意] 时间复杂度取决于pi ...

  2. P1049 找第K大的数

    题目描述 给定一个无序正整数序列, 以及另一个数n (1<=n<=1000000), 然后以类似快速排序的方法找到序列中第n大的数(关于第n大的数:例如序列{1,2,3,4,5,6}中第3 ...

  3. 找出N个无序数中第K大的数

    使用类似快速排序,执行一次快速排序后,每次只选择一部分继续执行快速排序,直到找到第K个大元素为止,此时这个元素在数组位置后面的元素即所求 时间复杂度: 1.若随机选取枢纽,线性期望时间O(N) 2.若 ...

  4. 快速排序算法的实现 && 随机生成区间里的数 && O(n)找第k小 && O(nlogk)找前k大

    思路:固定一个数,把这个数放到合法的位置,然后左边的数都是比它小,右边的数都是比它大 固定权值选的是第一个数,或者一个随机数 因为固定的是左端点,所以一开始需要在右端点开始,找一个小于权值的数,从左端 ...

  5. [51NOD1105]第k大的数(二分答案)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1105 先排序,二分上下界分别是最小的两个数和最大的两个数的乘积 ...

  6. 找出整数中第k大的数

    一  问题描述: 找出 m 个整数中第 k(0<k<m+1)大的整数. 二  举例: 假设有 12 个整数:data[1, 4, -1, -4, 9, 8, 0, 3, -8, 11, 2 ...

  7. 算法题之找出数组里第K大的数

    问题:找出一个数组里面前K个最大数. 解法一(直接解法): 对数组用快速排序,然后直接挑出第k大的数.这种方法的时间复杂度是O(Nlog(N)).N为原数组长度. 这个解法含有很多冗余,因为把整个数组 ...

  8. OpenJudge计算概论-找出第k大的数

    /*================================================ 找出第k大的数 总时间限制: 1000ms 内存限制: 1000kB 描述 用户输入N和K,然后接 ...

  9. 寻找第K大的数

    在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,解决这个问题的方法很多. 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找 ...

随机推荐

  1. (x&y) + ((x^y)>>1)即x和y的算数平均值

    (x&y) + ((x^y)>>1)相当于(x+y)/2 (x&y)+((x^y)>>1),把x和y里对应的每一位(指二进制位)都分成三类,每一类分别计算平均值 ...

  2. PV UV IP含义及区别

    --------首先来看看ip.uv和pv的定义---------- PV(访问量):即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次. UV(独立访客):即Unique Vis ...

  3. electron小例子

    说明:该例子主要实现把输入框中的文字保存到本地的文本文档中. 在main中添加几句代码 const ipcMain = electron.ipcMain; const dialog = electro ...

  4. mysql知识初篇(一)

    mysql介绍 (1) mysql数据库是瑞典AB开发. (2) mysql--> sun --> oracle. (3) mysql数据库的特点. 1. 开源. 2. 免费. 3. 跨平 ...

  5. emmet使用笔记及sublime常用快捷键

    2015.10.07补: 格式化JS代码: 安装JSformat插件,选中需要格式化的JS代码,Ctrl+Alt+f 使用笔记看:http://www.w3cplus.com/tools/emmet- ...

  6. centos chkconfig 服务设置

    chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...

  7. Linux 服务器安全技巧

    毋庸置疑,对于系统管理员,提高服务器的安全性是最重要的事情之一.因此,也就有了许多针对这个话题而生的文章.博客和论坛帖子. 一台服务器由大量功能各异的部件组成,这一点使得很难根据每个人的需求去提供定制 ...

  8. getParamValues()

    http://blog.csdn.net/msg_java2011/article/details/6529226

  9. ASP.net 验证码(C#) MVC

    ASP.net 验证码(C#) MVC http://blog.163.com/xu_shuhao/blog/static/5257748720101022697309/ 网站添加验证码,主要为防止机 ...

  10. IBatis.Net 表连接查询(五)

    IBatis.Net之多表查询: 一.定制实际对应类的方式 首先配置多表的测试数据库,IBatis.Net之Oracle表连接查询配置: 首先新建两张表如下: 为两张表建立外键: ALTER TABL ...