美文网首页
从100w个数中找到前10个最小的,并排序

从100w个数中找到前10个最小的,并排序

作者: chanyi | 来源:发表于2020-08-26 11:44 被阅读0次

此类问题可以总结为从n(很大)个数中找到m(很小)个最大或最小的数
此类问题的方法有如下几种
1、堆排序
2、位图排序

1、堆排序

如果是找最大数,则从n中选择m个数,建立容量为m的大顶堆,然后剩下的数依次遍历,和堆中的数作比较,大的插入,小的跳过。
此种方法的计算复杂度为n*log(m)。
具体代码(这里的小顶堆使用java的优先队列PriorityQueue实现

private static final int nCount = 10;
  private static final int mCount = 5;
  //实现在n个数中找到最大的前m个数
  public static void main(String[] args) {
    int[] n = init_n();
    Queue<Integer> minQueue = init_big_top_heap(mCount,n);
    for (int i = mCount; i < n.length; i++) {
      minQueue = compare(n[i],minQueue);
    }
    //打印最终结果
    System.out.println("");
    System.out.println("result:");
    Iterator iterator = minQueue.iterator();
    while(iterator.hasNext()){
      System.out.print(iterator.next()+",");
    }
  }

  //初始化大数组
  public static int[] init_n(){
    //建立一个容量为100w的数组
    int[] n = new int[nCount];
    Random random = new Random();
    for (int i = 0; i < nCount ; i++) {
      n[i] = random.nextInt(128);
    }
    //
    System.out.println("打印初始化数组:");
    for (int i = 0; i < n.length; i++) {
      System.out.print(n[i]+",");
    }
    return n;
  }

  //初始化小顶堆
  public static Queue init_big_top_heap(int mCount,int[] mArr){
    Queue<Integer> minQueue = new PriorityQueue<>();
    for (int i = 0; i < mCount; i++) {
      minQueue.add(mArr[i]);
    }
    return minQueue;
  }

  //数与堆顶元素比较,如果大则插入,小则跳过
  public static Queue<Integer> compare(int num,Queue<Integer> minQueue){
    if(num>minQueue.peek()){
      minQueue.poll();
      minQueue.add(num);
    }
    return minQueue;
  }

2、位图排序

思路是:遍历数组中所有元素,找到最大值,然后建立一个以最大值为容量的byte数组用来存放0,1。再次遍历数组,将数组中的元素i对应的byte[i]的值设置为1。得到byte数组之后,从最大值到0开始遍历,如果遍历到的数j对应的byte[j]==1,则放入结果集中。直至结果集满或遍历结束
(需要注意的是,这里没有考虑数据重复的情况)
具体代码(代码是在n个数组中找出最大的m个数

private static final int nCount = 10;
  private static final int mCount = 5;

  private static int[]  initArr(){
    int n[] = new int[nCount];
    Random random = new Random();
    for (int i = 0; i < nCount; i++) {
      n[i] = random.nextInt(128);
    }
    System.out.println("打印初始化数组:");
    for (int i = 0; i < n.length; i++) {
      System.out.print(n[i]+",");
    }
    return n;
  }

  public static int[] getTop(int[] inputArray) {
    int maxValue = Integer.MIN_VALUE;
    //找到数组中的最大值
    for (int i = 0; i < inputArray.length; ++i) {
      if (maxValue < inputArray[i]) {
        maxValue = inputArray[i];
      }
    }
    System.out.println("maxValue:"+maxValue);
    //建立位图
    byte[] bitmap = new byte[maxValue + 1];
    for (int i = 0; i < inputArray.length; ++i) {
      int value = inputArray[i];
      bitmap[value] = 1;
    }
    int[] result = new int[mCount];
    int index = 0;
    //从最大值遍历到0,如果对应位图中值为1,则证明存在,放入结果集中
    for (int i = maxValue; i >= 0 & index < result.length; --i) {
      if (bitmap[i] == 1) {
        result[index++] = i;
      }
    }
    return result;
  }
  
  public static void main(String[] args) {
    System.out.println("Sort begin...");
    long current = System.currentTimeMillis();
    int[] result = getTop(initArr());
    System.out.println(System.currentTimeMillis() - current);
    System.out.println("");
    System.out.println("result:");
    for (int i = 0; i < result.length; ++i) {
      System.out.print(result[i] + ",");
    }
  }

相关文章

  • 从100w个数中找到前10个最小的,并排序

    此类问题可以总结为从n(很大)个数中找到m(很小)个最大或最小的数此类问题的方法有如下几种1、堆排序2、位图排序 ...

  • 简单选择排序(java)

    从数组中找到最小的一个数字,和数组第一个数字交换,如此反复操作即可实现排序。时间复杂度O(n^2),是稳定的排序算...

  • 排序算法动图加非伪代码通俗详解

    所有排序算法 1.冒泡排序每次交换2个,交换到最后的那个数是最大的image 选择排序首先在未排序序列中找到最小(...

  • 选择排序

    二 选择排序 * 【选择排序】:最值出现在起始端 * * 第1趟:在n个数中找到最小(大)数与第一个数交换位置 *...

  • 堆和堆排序

    最小K个数 堆排序 堆排序

  • 选择排序

    【选择排序】:最值出现在起始端第1趟:在n个数中找到最小(大)数与第一个数交换位置第2趟:在剩下n-1个数中找到最...

  • 2018-04-27 海量数字中找到最大/小的K个(TopK 问

    来自xie4ever假如业务场景需要在十亿个数字中找到最小k个的数字。设计算法。 排序方法。最容易想到肯定是排序了...

  • ×2019-12-18 找到 K 个最接近的元素

    给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是...

  • 选择排序

    选择排序C语言 【选择排序】:最值出现在起始端 第1趟:在n个数中找到最小(大)数与第一个数交换位置 第2趟:在剩...

  • 大数topk

    100w个数中找出最大的100个数。 方案1: 采用局部淘汰法。选取前100个元素,并排序,记为序列L。然后一次扫...

网友评论

      本文标题:从100w个数中找到前10个最小的,并排序

      本文链接:https://www.haomeiwen.com/subject/ejqxsktx.html