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

  1. import com.sun.media.sound.SoftTuning;
  2. import java.util.Arrays;
  3. import java.util.Random;
  4. public class Main {
  5. int[] generate(int n) {
  6. Random random = new Random();
  7. int[] a = new int[n];
  8. for (int i = 0; i < a.length; i++) {
  9. a[i] = random.nextInt(20);
  10. }
  11. return a;
  12. }
  13. int stupid(int[] a) {
  14. Arrays.sort(a);
  15. return a[a.length / 2];
  16. }
  17. int go(int a[], int left, int right, int k) {
  18. if (left == right) return a[left];
  19. int i = left, j = right;
  20. int spliter = a[left];
  21. while (true) {
  22. while (j > i && a[j] > spliter) j--;
  23. if (j == i) break;
  24. a[i] = a[j];
  25. a[j] = spliter;
  26. i++;
  27. while (j > i && a[i] < spliter) i++;
  28. if (j == i) break;
  29. a[j] = a[i];
  30. a[i] = spliter;
  31. j--;
  32. }
  33. if (i - left == k) return a[i];
  34. else if (i - left > k) {
  35. return go(a, left, i - 1, k);
  36. } else {
  37. return go(a, i + 1, right, k - (i + 1 - left));
  38. }
  39. }
  40. int fast(int[] a) {
  41. return go(a, 0, a.length - 1, a.length / 2);
  42. }
  43. Main() {
  44. Random random = new Random();
  45. for (int i = 0; i < 100; i++) {
  46. int[] a = generate(random.nextInt(100) + 31);
  47. int[] b = Arrays.copyOfRange(a, 0, a.length);
  48. int mine = fast(b);
  49. b = Arrays.copyOfRange(a, 0, a.length);
  50. int ans = stupid(b);
  51. if (mine != ans) {
  52. throw new RuntimeException("error");
  53. }
  54. }
  55. }
  56. public static void main(String[] args) {
  57. new Main();
  58. }
  59. }

快排法求第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. RxJava 操作符 on和doOn 线程切换 调度 Schedulers 线程池 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. ES6 主要的新特性

    本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...

  3. 【Scala】Scala多线程-并发实践

    Scala多线程-并发实践 scala extends Thread_百度搜索 scala多线程 - 且穷且独立 - 博客园 Scala和并发编程 - Andy Tech Talk - ITeye博客 ...

  4. 从VMware虚拟机安装到hadoop集群环境配置详细说明(第一期)

    http://blog.csdn.net/whaoxysh/article/details/17755555 虚拟机安装 我安装的虚拟机版本是VMware Workstation 8.04,自己电脑上 ...

  5. 【转载】springboot:如何优雅的使用mybatis

    这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较喜欢jpa这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis.到网上找了一下关于spring boot ...

  6. capwap学习笔记——初识capwap(二)

    2.5.1 AC发现机制 WTP使用AC发现机制来得知哪些AC是可用的,决定最佳的AC来建立CAPWAP连接. WTP的发现过程是可选的.如果在WTP上静态配置了AC,那么WTP并不需要完成AC的发现 ...

  7. Red Hat Enterprise Linux AS release 4 yum源

    $sudo vim /etc/yum.conf [main] cachedir=/var/cache/yum debuglevel=2 logfile=/var/log/yum.log pkgpoli ...

  8. [PureScript] Break up Expressions into Cases in PureScript using Simple Pattern Matching

    Pattern matching in functional programming languages is a way to break up expressions into individua ...

  9. Android 关于 ActionBarSherlock 的使用

    原文地址 本文内容 使用 主题化 ActionBarSherlock 演示项目 本文 ActionBarSherlock 简单演示 最近一个星期被 actionsherlock 搞得很不爽(光去足疗店 ...

  10. iOS 设置 UIWebView UserAgent

    NSString *userAgent = [[[UIWebView alloc] init] stringByEvaluatingJavaScriptFromString:@"naviga ...