快排法求第k大,复杂度为O(n)

import com.sun.media.sound.SoftTuning;

import java.util.Arrays;
import java.util.Random; public class Main {
int[] generate(int n) {
Random random = new Random();
int[] a = new int[n];
for (int i = 0; i < a.length; i++) {
a[i] = random.nextInt(20);
}
return a;
} int stupid(int[] a) {
Arrays.sort(a);
return a[a.length / 2];
} int go(int a[], int left, int right, int k) {
if (left == right) return a[left];
int i = left, j = right;
int spliter = a[left];
while (true) {
while (j > i && a[j] > spliter) j--;
if (j == i) break;
a[i] = a[j];
a[j] = spliter;
i++;
while (j > i && a[i] < spliter) i++;
if (j == i) break;
a[j] = a[i];
a[i] = spliter;
j--;
}
if (i - left == k) return a[i];
else if (i - left > k) {
return go(a, left, i - 1, k);
} else {
return go(a, i + 1, right, k - (i + 1 - left));
}
} int fast(int[] a) {
return go(a, 0, a.length - 1, a.length / 2);
} Main() {
Random random = new Random();
for (int i = 0; i < 100; i++) {
int[] a = generate(random.nextInt(100) + 31);
int[] b = Arrays.copyOfRange(a, 0, a.length);
int mine = fast(b);
b = Arrays.copyOfRange(a, 0, a.length);
int ans = stupid(b);
if (mine != ans) {
throw new RuntimeException("error");
}
}
} public static void main(String[] args) {
new Main();
}
}

快排法求第k大的更多相关文章

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

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

  2. 面试题:求第K大元素(topK)?

    一.引言二.普通算法算法A:算法B:三.较好算法算法C:算法D:四.总结 一.引言 ​ 这就是类似求Top(K)问题,什么意思呢?怎么在无序数组中找到第几(K)大元素?我们这里不考虑海量数据,能装入内 ...

  3. 算法导论学习之线性时间求第k小元素+堆思想求前k大元素

    对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...

  4. 无序数组求第K大的数

    问题描述 无序数组求第K大的数,其中K从1开始算. 例如:[0,3,1,8,5,2]这个数组,第2大的数是5 OJ可参考:LeetCode_0215_KthLargestElementInAnArra ...

  5. POJ 2985 Treap平衡树(求第k大的元素)

    这题也能够用树状数组做,并且树状数组姿势更加优美.代码更加少,只是这个Treap树就是求第K大元素的专家--所以速度比較快. 这个也是从那本红书上拿的模板--自己找了资料百度了好久,才理解这个Trea ...

  6. ACM_求第k大元素(两次二分)

    求第k大 Time Limit: 6000/3000ms (Java/Others) Problem Description: 给定两个数组A和B,大小为N,M,每次从两个数组各取一个数相乘放入数组C ...

  7. poj 2985 The k-th Largest Group 树状数组求第K大

    The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8353   Accepted ...

  8. 《数据结构与算法分析:C语言描述》读书笔记------练习1.1 求第K大的数

    求一组N个数中的第k个最大者,设k=N/2. import java.util.Random; public class K_Max { /** * @param args */ //求第K大的数,保 ...

  9. HDU 5249 离线树状数组求第k大+离散化

    KPI Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

随机推荐

  1. mongodb 按配置文件mongodb.conf启动

    命令如下 mongod --config /etc/mongodb.conf

  2. Spring Boot集成JasperReports生成PDF文档

    由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲染生成PDF文档.本人文采欠缺,写作能力 ...

  3. 用css3实现风车效果

    前面讲过css3可以替代很多js实现的效果,其实很多时候纯css3甚至可以替代图片,直接用css3就可以画出一些简单的图片.虽然css3画出来的图片效果可能不如直接用图片的好,实现起来也比较复杂,最麻 ...

  4. 大数据开发实战:Hive优化实战2-大表join小表优化

    4.大表join小表优化 和join相关的优化主要分为mapjoin可以解决的优化(即大表join小表)和mapjoin无法解决的优化(即大表join大表),前者相对容易解决,后者较难,比较麻烦. 首 ...

  5. ML、DL相关资源

    1. http://x-algo.cn/index.php/category/nlp/

  6. (算法)等概率选出m个整数

    题目: 从大小为n的整数数组A中随机选出m个整数,要求每个元素被选中的概率相同. 思路: n选m,等概率情况下,每个数被选中的概率为m/n. 方法: 初始化:从A中选择前m个元素作为初始数组: 随机选 ...

  7. BAT,你好!字幕组,再见!——也许要跟美剧说再见了~

    对于美剧迷来说,上周的星期六(2014 年11 月 22 日)是黑色的一天. 11 月 22 日,人人影视暂时关站,并发布公告称网站正在清理内容.虽然这不是人人影视第一次关站清理,而且人人影视还给出提 ...

  8. Android开发——Android M(6.0) 权限解决方案

    Android开发--Android M(6.0) 权限解决方案 自从Android M(6.0)发布以来,权限管理相比以前有了很大的改变,很多程序员发现之前运行的好好的Android应用在Andro ...

  9. Linux下使用Supervisor来管理维护程序-详解

    一.场景 常常需要后台支行一个进程,或者开机自动运行等等. 首先,后台运行可以考虑使用nohup和&来实现,想实现开机运行,可以把命令写到/etc/rc.d/rc.local中. 但是,上面这 ...

  10. python pdfplumber用于pdf表格提取

    import pdfplumber with pdfplumber.open('test.pdf') as pdf: #page_count = len(pdf.pages()) p0 = pdf.p ...