快排法求第k大

时间:2022-01-01 01:58:55

快排法求第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&lowbar;P1177 【模板】快速排序 (快排和找第k大的数)

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

  2. 面试题:求第K大元素(topK)&quest;

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

  3. 算法导论学习之线性时间求第k小元素&plus;堆思想求前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&lowbar;求第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&period;1 求第K大的数

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

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

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

随机推荐

  1. 在CentOS7上安装Docker

    具体过程如下 到网站下载centos7: http://isoredirect.centos.org/ http://isoredirect.centos.org/centos/7/isos/x86_ ...

  2. win commands

    wmic process where name="explorer.exe" delete 我想你问得应该是运行命令吧!我查了,没有,你自己参考一下:Windows常用命令集 wi ...

  3. 完全背包问题:湫湫系列故事&horbar;&horbar;减肥记I(HDU 4508)

    湫湫系列故事――减肥记I  HDU 4508 一道裸的完全背包 #include<iostream> #include<algorithm> #include<stdio ...

  4. LeetCode----67&period; Add Binary&lpar;java&rpar;

    package addBinary67;/* Given two binary strings, return their sum (also a binary string).For example ...

  5. 实战3--项目开始--准备&colon;&colon;&colon;资源分类&comma; 日志系统&comma; 写BaseDao

     项目资源分类: 1.   package: base, dao, dao.impl, domain, service, service.impl, util, view.action 2.   co ...

  6. Tomcat多域名访问

    对于域名解析相信很多小伙伴都了解过,就是我们在万网购买一个域名,比如hpugs.com,然后呢?我们希望域名与我们的服务器绑定,然后通过域名直接访问我们的项目,这就是本篇要和大家一起探讨的问题.下面开 ...

  7. Android官方技术文档翻译——迁移 Gradle 项目到1&period;0&period;0 版本

    本文译自Android官方技术文档<Migrating Gradle Projects to version 1.0.0>,原文地址:http://tools.android.com/te ...

  8. LG3834 可持久化线段树1

    题意 给定\(N\)个整数构成的序列,将对于指定的闭区间查询其区间内的第\(K\)小值. $n \leq 2 \times 10^5 $ 思路 在\([l,r]\)区间内的数的个数,可以用\(sum[ ...

  9. spring aop 切面编程

    import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Ha ...

  10. &lbrack;Postman&rsqb;调试和日志&lpar;10&rpar;

    Postman应用程序在我们发布之前会经过广泛的测试和beta版本.也就是说,可能存在应用程序崩溃或出现意外行为的情况.如果您无法   自行解决问题,可以在GitHub跟踪器中提出问题,或者 如果您希 ...

相关文章