如何在很大数量级的数据中(比如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);
}

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

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

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

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

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

原文地址:https://www.cnblogs.com/oldtab/p/4449486.html