数据结构笔记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 }
原文地址:https://www.cnblogs.com/kingxiaozi/p/4421751.html