zoukankan      html  css  js  c++  java
  • 数据结构笔记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 }
  • 相关阅读:
    linux中iptables的用法
    Git介绍及安装配置
    第一个shell脚本
    Nginx配置优化解读
    Python中print格式化输出
    python 程序构架浅析
    Python 常用字符串操作
    Python入门学习:网络刷博器爬虫
    vSphere SDK for Java
    vROPS中获取虚拟机在VC中的UUID
  • 原文地址:https://www.cnblogs.com/kingxiaozi/p/4421751.html
Copyright © 2011-2022 走看看