乱序数组中第k大的数(顺序统计量)
该问题是顺序统计量中十分经典的问题。
使用快排中的分区法,将第k大的数排序。若双向扫描分区加上三点中值法或绝对中值法,可以保证在 O(n) 时间里找出第k大的数。
补充:可以直接使用C++STL中的nth_element函数(一定注意使用形式!!!!)。
1 /*
2 * 第k大的数
3 */
4 int part_(int arr[], int p, int r)
5 {
6 int b = p;
7 while (p <= r) {
8 while (p <= r && arr[p] <= arr[b]) p++;
9 while (p <= r && arr[r] > arr[b]) r--;
10 if (p < r)
11 swap(arr[r], arr[p]);
12 }
13 swap(arr[b], arr[r]);
14 return r;
15 }
16 int select(int arr[], int p, int r,int k)
17 {
18 int kp = 0;
19 while (1) {
20 kp = part_(arr, p, r); // 双向扫描分区
21 if (kp == k) return arr[kp];
22 else if (kp > k) r = kp - 1;
23 else p = kp + 1;
24 }
25 }
26 int main()
27 {
28 int ar[10];
29 srand((unsigned)time(nullptr));
30 for (int i = 0; i <= 9; i++)
31 cout << (ar[i] = rand() % (15 - 1 + 1) + 1) << " ";
32 cout << endl;
33 // 打印第k大的数
34 int arr[10];
35 for (int i = 0; i <= 9; i++)
36 arr[i] = ar[i];
37 cout << select(ar, 0, 9, 9) << endl;
38 nth_element(arr, arr + 9, arr + 10); // 包头不包尾,要有尾后迭代器
39 cout << arr[9]<< endl;
40 return 0;
41 }
乱序数组中第k大的数(顺序统计量)的更多相关文章
- 最快效率求出乱序数组中第k小的数
题目:以尽量高的效率求出一个乱序数组中按数值顺序的第k 的元素值 思路:这里很容易想到直接排序然后顺序查找,可以使用效率较高的快排,但是它的时间复杂度是O(nlgn),我们这里可以用一种简便的方法,不 ...
- [经典算法题]寻找数组中第K大的数的方法总结
[经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26 字体:[大 中 小] 打印复制链接我要评论 今天看算法分析是,看到一个这样的问题,就是在一堆数据 ...
- 寻找数列中第k大的数算法分析
问题描述:给定一系列数{a1,a2,...,an},这些数无序的,现在求第k大的数. 看到这个问题,首先想到的是先排序,然后直接输出第k大的数,于是得到啦基于排序的算法 算法一: #include&l ...
- 求数列中第K大的数
原创 利用到快速排序的思想,快速排序思想:https://www.cnblogs.com/chiweiming/p/9188984.html array代表存放数列的数组,K代表第K大的数,mid代表 ...
- 查找数组中第k大的数
问题: 查找出一给定数组中第k大的数.例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8-- 思考:1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]. 2. ...
- 找出N个无序数中第K大的数
使用类似快速排序,执行一次快速排序后,每次只选择一部分继续执行快速排序,直到找到第K个大元素为止,此时这个元素在数组位置后面的元素即所求 时间复杂度: 1.若随机选取枢纽,线性期望时间O(N) 2.若 ...
- 找出整数中第k大的数
一 问题描述: 找出 m 个整数中第 k(0<k<m+1)大的整数. 二 举例: 假设有 12 个整数:data[1, 4, -1, -4, 9, 8, 0, 3, -8, 11, 2 ...
- 寻找数组中第K大的数
给定一个数组A,要求找到数组A中第K大的数字.对于这个问题,解决方案有不少,此处我只给出三种: 方法1: 对数组A进行排序,然后遍历一遍就可以找到第K大的数字.该方法的时间复杂度为O(N*logN) ...
- 查找无序数组中第K大的数
思路: 利用快速排序的划分思想 可以找出前k大数,然后不断划分 直到找到第K大元素 代码: #include <iostream> #include <algorithm> # ...
随机推荐
- c++ stringstream 实现字符串与int之间的转换
#include <iostream> #include <sstream> using namespace std; int main() { //string转int st ...
- 量化研究之“大A打板敢死队”是如何做换手板与撬板的?
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 涨停跌停板分类 涨停.跌停是A股特有的现象,其他主要市场,例如美股.港股都不存在涨跌停的规则.涨停.跌停 ...
- Java:安装新版本Java、环境配置
最新版2021年版 Java安装目录 2.在系统变量中设置2项属性,JAVA_HOME.PATH(大小写无所谓),若已存在这点击编辑,不存在则新建 参数为: JAVA_HOME: D:\Java\ ...
- docker学习笔记(3)——联合文件系统与数据卷
参考资料: 1.官网教程:https://docs.docker.com/reference/ 2.视频教程:https://www.bilibili.com/video/BV1og4y1q7M4?t ...
- 关于Union和 Union all,以及出现 ORA-12704:字符集不匹配问题
一.Union和 Union all 1.Union 对两个结果集进行并集操作: 对结果进行去重操作,不包括重复行: 并进行默认排序. -----效率相对较低 2.Union all 对两个结果集进行 ...
- Python 递归函数返回值为 None 的解决办法
在使用 Python 开发的过程中,避免不了会用到递归函数.但递归函数的返回值有时会出现意想不到的情况. 下面来举一个例子: >>> def fun(i): ... i += 1 . ...
- 前端性能优化 —— 使用 BMP 图片代替 canvas.toDataURL
前端开发中有时需要将 canvas 的内容导出成图片文件,例如供 CSS 使用,通常会使用 canvas.toDataURL,兼容性好并且简单. 不过 canvas.toDataURL 显然是非常低效 ...
- 用两行代码实现重试功能,spring-retry真是简单而优雅
背景 最近做的一个需求,需要调用第三方接口.正常情况下,接口的响应是符合要求的,只有在网络抖动等极少数的情况下,会存在超时情况.因为是小概率事件,所以一次超时之后,进行一次重试操作应该就可以了.重试很 ...
- Java基础——final、static关键字
final关键字是最终的意思,可以修饰成员方法.成员变量.类 特点: 1.修饰方法:表示该方法是最终方法,不能被重写 2.修饰变量:表示变量是常量,不能再次被赋值 3.修饰类:表示类是最终类,不能被继 ...
- 6月19日 python学习总结 Django之路由系统
Django之路由系统 Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调 ...