数据结构笔记1_求第k个最大者

参考的文章有:

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

 1 import java.util.Arrays;
 2 import java.util.Random;
 3
 4 //选择问题答案
 5 public class Test4 {
 6     public static final Random RANDOM = new Random(47);
 7
 8     // 假设N = 10
 9     public static void main(String[] args) {
10         for (int i = 0; i < 10; i++) {
11             printResult(createArray(RANDOM.nextInt(100000)));
12         }
13     }
14
15     // 冒泡排序
16     public static void sort(int[] values) {
17         for (int i = 1; i < values.length; i++) {
18             for (int j = 0; j < values.length - i; j++) {
19                 if (values[j] > values[j + 1]) {
20                     int temp = values[j];
21                     values[j] = values[j + 1];
22                     values[j + 1] = temp;
23                 }
24             }
25         }
26     }
27
28     // 分批处理
29     public static int select(int[] values) {
30         if (values == null || values.length == 0) {
31             throw new NullPointerException("values can‘t be null.");
32         }
33         int k = values.length / 2;
34         //数组拷贝
35         int[] temp = Arrays.copyOf(values, k);
36         sort(temp);//排序(降序)
37         for (int i = k; i < values.length; i++) {
38             if (values[i] < temp[k - 1]) {
39                 temp[k - 1] = temp[k - 2];
40                 for (int j = k - 2; j > 0; j--) {
41                     if (values[i] > temp[j]) {
42                         temp[j + 1] = values[i];
43                         break;
44                     } else {
45                         temp[j] = temp[j - 1];
46                     }
47                 }
48             }
49         }
50         return temp[k - 1];
51     }
52
53     // 创建随即数组
54     public static int[] createArray(int length) {
55         int[] values = new int[length];
56         for (int i = 0; i < length; i++) {
57             values[i] = RANDOM.nextInt(length * 2);
58         }
59         return values;
60     }
61
62     // 打印结果
63     public static void printResult(int[] values) {
64         System.out.println("length:" + values.length);
65         long start = System.currentTimeMillis();
66         System.out.println("result:" + select(values));
67         System.out.println("cost:" + (System.currentTimeMillis() - start)
68                 + "ms");
69         System.out.println("--------------------------------");
70     }
71 }
时间: 2024-10-08 10:42:06

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

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

求一组N个数中的第k个最大者,设k=N/2. 1 import java.util.Random; 2 3 4 public class K_Max { 5 6 /** 7 * @param args 8 */ 9 //求第K大的数,保证K大于等于1,小于等于array.length/2哦 10 public static int TopK(int array[],int K) 11 { 12 int topk[] = new int [K]; 13 for(int i = 0; i<topk.

11、蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现

11.蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现 本篇名言:"人生不售来回票,一旦动身,绝不能复返." 继续栈应用实现,这次是来看下表达式求值的栈实现. 欢迎转载,转载请标明出处: 1.  表达式求值 表达式求值是设计语言编译中的一个基本问题,它的实现是栈应用的又一个典型例子. 任何一个表达式都是由操作数(Operand).运算符(operator)和界限符(delimiter)组成. 操作数可以是常数也可以是变量或变量的标识符. 运算符可以分为算术运算符.关系运算符和逻辑运算符

48. 蛤蟆的数据结构笔记之四十八的有向无环图的应用关键路径

48. 蛤蟆的数据结构笔记之四十八的有向无环图的应用关键路径 本篇名言:"富贵不淫贫贱乐 ,男儿到此是豪雄.-- 程颢" 这次来看下有向无环图的另一个应用关键路径. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47135061 1.  关键路径 与AOV-网相对应的是AOE-网(Activity On Edge)即边表示活动的网.AOE-网是一个带权的有向无环图,其中,顶点表示事件(Event),弧表示活动,权表

44. 蛤蟆的数据结构笔记之四十四弗洛伊德Floyd算法

44. 蛤蟆的数据结构笔记之四十四弗洛伊德Floyd算法 本篇名言:"希望是厄运的忠实的姐妹. --普希金" 我们继续来看下数据结构图中的一个算法,这个算法来自图灵奖得主. 1.  Floyd算法介绍 Floyd算法又称为插点法,是一种用于寻找给定的加权图中多源点之间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名.注意这个可不是心理学的那个弗洛伊德. 是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径

33. 蛤蟆的数据结构笔记之三十三广义表实现二

33. 蛤蟆的数据结构笔记之三十三广义表实现二 本篇名言:" 希望是附丽于存在的,有存在,便有希望,有希望,便是光明.--鲁迅" 我们继续来看下广义表的其他代码实现.代码均来自网络,解释来自蛤蟆,均亲测可行. 欢迎转载,转载请标明出处: 1.  广义表实现二 1.1         main 创建两个链表的指针head和L. 输入一个字符串,调用GLCreate函数创建广义表.显示,获取头表,尾表,输出长度,深度,原子个数,复制列表,Merge列表,遍历,比较广义表操作. 如下图1:

18、蛤蟆的数据结构笔记之十八链表实现稀疏矩阵

18.蛤蟆的数据结构笔记之十八链表实现稀疏矩阵 本篇名言:"必须如蜜蜂一样,采过许多花,才能酿出蜜来." 上篇中实现了栈在多项式实现中的例子,再来看下稀疏矩阵通过链表方式实现. 关键字:十字链表存储 欢迎转载,转载请标明出处: 1.  十字链表存储 十字链表(OrthogonalList)是有向图的另一种链式存储结构.该结构可以看成是将有向图的邻接表和逆邻接表结合起来得到的.用十字链表来存储有向图,可以达到高效的存取效果.同时,代码的可读性也会得到提升. 为便于理解后续代码,从网上摘了

43. 蛤蟆的数据结构笔记之四十三最短路径之迪杰斯特拉(Dijkstra )算法

43. 蛤蟆的数据结构笔记之四十三最短路径之迪杰斯特拉(Dijkstra )算法 本篇名言:"辛勤的蜜蜂永没有时间悲哀.--布莱克" 这次来看下Dijkstra )算法.还是老方法,先原理,后实现.代码来自网络. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47046031 1.  最短路径 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径. 管道铺设.线路安排

46. 蛤蟆的数据结构笔记之四十六普里姆算法

46. 蛤蟆的数据结构笔记之四十六普里姆算法 本篇名言:"手莫伸 ,伸手必被捉.党与人民在监督 ,万目睽睽难逃脱.汝言惧捉手不伸 ,他道不伸能自觉 , 其实想伸不敢伸 ,人民咫尺手自缩.-- 陈毅" 连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接起来,并且使得权值的和最小.构造连通网的最小代价生成树,即最小生成树(Minimum Cost Spanning Tree). 找连通图的最

(DS 《算法入门经典》)UVA 11991 Easy Problem from Rujia Liu?(求第k个v出现的索引)

题目大意: 求第k个v出现的索引 解题思路: 如果能构造出一个数据结构,使得data[v][k]就是第k个v出现的索引值即可求解.data[v]表示数v出现的索引数组, data[v][k]表示第k个v出现的索引. Problem E Easy Problem from Rujia Liu? Though Rujia Liu usually sets hard problems for contests (for example, regional contests like Xi'an 200