参考的文章有:
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