zoukankan      html  css  js  c++  java
  • 如何在很大数量级的数据中(比如1个亿)筛选出前10万个最小值?之六

    小结一下:

    对这个问题,到目前,我们得到了两段比较好的代码:堆选择与快速选择。

    堆选择,是我根据维基百科/堆排序/C++代码,改写得。

    快速选择,为ExcelHome的知名网友香川群子所写。她并指出,该代码去掉提前退出的条件,即为快速排序。即:

    void SortQuick(int data[], int Low, int High)
    {
      int low= Low,   high= High;
      for(int key= data[(Low+High)/2]; low< high; )
      {
        for( ; low< High && key> data[low]; ) low++;
        for( ; Low< high && key< data[high]; ) high--;
        if(low<= high) swap(data[low], data[high]), add+= low==high, low++, high--;
      }
      if(low< High) SortQuick(data, low,  High);
      if(Low< high) SortQuick(data, Low, high);
    }
    

      应该加个对外的函数接口:

    void QuickSort(int data[], int m)
    {
      SortQuick(data, 0, m-1);
    }
    

      快速选择,本质是将数据分成两组。因此,这里称它为分组方式。简称分组。

    那么,这两个好的代码之间来比较。会是怎么样一个结果呢?

    我做了一下。当选择为百选一,两者速度相当。堆略快。千选一,堆快。十选一,分组快。

    前面这些代码,尤其是这两段好代码。为我们处理更大数据量。打下了一个基础。

    这个总结,也算为之后的工作,作一个广告。

  • 相关阅读:
    洛谷P4547 [THUWC2017]随机二分图
    洛谷P4590 [TJOI2018]游园会
    洛谷P4099 [HEOI2013]SAO
    #4719. 内凸包
    #1612. 天平(scales)
    #3164. 「CEOI2019」立方填词
    #4728. 问题求解
    #2754. Count(count)
    sa模板
    bzoj 2553: [BeiJing2011]禁忌
  • 原文地址:https://www.cnblogs.com/oldtab/p/4449486.html
Copyright © 2011-2022 走看看