参考的文章有:

http://www.cnblogs.com/CCBB/archive/2009/06/01/1493971.html

http://www.cnblogs.com/zhangchaoyang/articles/2236860.html

http://zhangliang008008.blog.163.com/blog/static/25136049200882423842325/

选择问题,即求N个数中第K个最大者。

方法一:根据书中所叙述,对N个数进行递减排序,取第K个数,即为第K个最大者。

      这是最容易想到的也是最容易写出来的方法,但这种方法效率很低,当N比较大的时候不适合用。

方法二:取出前K个数读入数组并(以递减的顺序)对其排序。接着将剩下的元素再逐个读入。当新元素被读到时,如果它小于数组中的第k个数则忽略,否则就将其放到数组中正确的位置上(即和数组中的元素比较),同时将数组中的一个元素挤出数组。当算法终止时,位于第k个位置上的数作为答案返回。

代码实例:

原创地址:http://www.cnblogs.com/zuoxiaolong/p/algorithm1.html

 import java.util.Arrays;
import java.util.Random; //选择问题答案
public class Test4 {
public static final Random RANDOM = new Random(47); // 假设N = 10
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
printResult(createArray(RANDOM.nextInt(100000)));
}
} // 冒泡排序
public static void sort(int[] values) {
for (int i = 1; i < values.length; i++) {
for (int j = 0; j < values.length - i; j++) {
if (values[j] > values[j + 1]) {
int temp = values[j];
values[j] = values[j + 1];
values[j + 1] = temp;
}
}
}
} // 分批处理
public static int select(int[] values) {
if (values == null || values.length == 0) {
throw new NullPointerException("values can't be null.");
}
int k = values.length / 2;
//数组拷贝
int[] temp = Arrays.copyOf(values, k);
sort(temp);//排序(降序)
for (int i = k; i < values.length; i++) {
if (values[i] < temp[k - 1]) {
temp[k - 1] = temp[k - 2];
for (int j = k - 2; j > 0; j--) {
if (values[i] > temp[j]) {
temp[j + 1] = values[i];
break;
} else {
temp[j] = temp[j - 1];
}
}
}
}
return temp[k - 1];
} // 创建随即数组
public static int[] createArray(int length) {
int[] values = new int[length];
for (int i = 0; i < length; i++) {
values[i] = RANDOM.nextInt(length * 2);
}
return values;
} // 打印结果
public static void printResult(int[] values) {
System.out.println("length:" + values.length);
long start = System.currentTimeMillis();
System.out.println("result:" + select(values));
System.out.println("cost:" + (System.currentTimeMillis() - start)
+ "ms");
System.out.println("--------------------------------");
}
}

数据结构笔记1_求第k个最大者的更多相关文章

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

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

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

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

  3. 【笔记】求数据前n个主成分以及对高维数据映射为低维数据

    求数据前n个主成分并进行高维数据映射为低维数据的操作 求数据前n个主成分 先前的将多个样本映射到一个轴上以求使其降维的操作,其中的样本点本身是二维的样本点,将其映射到新的轴上以后,还不是一维的数据,对 ...

  4. *HDU2852 树状数组(求第K小的数)

    KiKi's K-Number Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  5. 树状数组求第k小的元素

    int find_kth(int k) { int ans = 0,cnt = 0; for (int i = 20;i >= 0;i--) //这里的20适当的取值,与MAX_VAL有关,一般 ...

  6. hdu 4217 Data Structure? 树状数组求第K小

    Data Structure? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  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. poj 2449(A*求第K短路)

    题目链接:http://poj.org/problem?id=2449 思路:我们可以定义g[x]为源点到当前点的距离,h[x]为当前点到目标节点的最短距离,显然有h[x]<=h*[x](h*[ ...

  9. 面试题:m个长度为n的ordered array,求top k 个 数字

    package com.sinaWeibo.interview; import java.util.Comparator; import java.util.Iterator; import java ...

随机推荐

  1. 026_关于shell中的特殊变量$0 $n $* $@ $! $?

    一. $n:获取当前执行的shell脚本的第N个参数,n=1..9,当n为0时表示脚本的文件名,如果n大于9,用大括号括起来like${10}. $*:获取当前shell的所有参数,将所有的命令行参数 ...

  2. CentOS6.5环境使用keepalived实现nginx服务的高可用性及配置详解

    keepalived基础概念    Keepalived是一个基于VRRP协议来实现的WEB服务高可用方案,可以利用其来避免单点故障.一个WEB服务至少会有2台服务器运行Keepalived,一台为主 ...

  3. MariaDB:登陆报错:mysqladmin: connect to server at 'localhost' failed

    见图: 解决办法: /etc/init.d/mysqld stop mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended ...

  4. S5PV210的根文件系统制作

    一.移植BusyBox1.下载BusyBox的源代码下载地址:http://www.busybox.net/downloads/,此处下载busybox-1.20.2.tar.bz2.2.解压并进入目 ...

  5. S5PV210 NAND Flash

    NAND Flash 关于NAND FlashS5PV210的NAND Flash控制器有如下特点:1) 支持512byte,2k,4k,8k的页大小2) 通过各种软件模式来进行NAND Flash的 ...

  6. Expm 1_3 数组中逆序对个数问题

    有一个数的序列A[1].A[2] .A[3] .…… .A[n],若i<j,并且A[i]>A[j],则称A[i]与A[j]构成了一个逆序对,设计算法求数列A中逆序对的个数. package ...

  7. Oracle系统表外键的更名

    正在看的ORACLE教程是:Oracle系统表外键的更名. Oracle中表的外键是保证系统参照完整性的手段,而参照完整性是指分布在两个表中的列所满足的具有主从性质的约束关系.外键涉及到两个表,其中一 ...

  8. InterruptedException 异常

    当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛InterruptedException的代表方法有: 1. jav ...

  9. LeetCode(29): 两数相除

    Medium! 题目描述: 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor ...

  10. 自己的vim配置

    nmap <F11> :source ~/.vimrc<CR> "n 普通模式 F11映射为 :source ~/.vimrc winpos 5 5 "wi ...