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

    快速选择

    这是一种快速将数据分成两组的方法。类似快速排序算法。在ExcelHome网站讨论一亿取十万这个问题时,得到该网站知名网友“香川群子”的VB代码。核心如下:

    Function QuickSort2(tr, l&, u&, k&) '递归算法的快速排序过程 不解释
        Dim i&, j&, r, t
        i = l: j = u: r = tr((l + u)  2)
        While i < j
            Do While i < u
                If tr(i) < r Then i = i + 1 Else Exit Do
            Loop
            Do While j > l
                If tr(j) > r Then j = j - 1 Else Exit Do
            Loop
            If i < j Then t = tr(i): tr(i) = tr(j): tr(j) = t: i = i + 1: j = j - 1 Else If i = j Then i = i + 1: j = j - 1
        Wend
        If k < j + 1 Then If j > l Then Call QuickSort2(tr, l, j, k)
        If k > i - 1 Then If i < u Then Call QuickSort2(tr, i, u, k)
        QuickSort2 = tr(k) '记录返回本次计算得到的第n个分界值
    End Function
    

      我把它改成了C代码。如下:

    void SortQuick(int data[], int Low, int High, int k)
    {
      int low= Low,   high= High;
      for(int key= data[(Low+High)/2]; low< high; )
      {
        while(low< High && key> data[low]) low++;                   //在左边,找大值
        while(Low< high && key< data[high]) high--;                 //在右边,找小值
        if(low<= high) swap(data[low], data[high]), low++, high--;
      }
      if(low< High && k>= low) SortQuick(data, low,  High, k);
      if(Low< high && k<= high) SortQuick(data, Low, high, k);
    }
    void TopKSortQuick(int data[], int m, int n)                    //m是总数n选择数
    {
      SortQuick(data, 0, m-1, n-1);
      sort(data, data+ n);                                          //排序方便比较
    }
    

      看起来简洁些。调用这个函数的代码,和前面给出过的类似。还是说说一亿取十万的用时:5.320秒。速度也非常快。

  • 相关阅读:
    Eclipse快捷键大全(转载)
    IE9浏览Flash页面时显示错位并不停地闪烁
    flash全屏事件和键盘按下事件部分不能触发问题
    AS3摘要(转载)
    【as3手册小记】ActionScript 中处理全屏模式的注意事项
    巧用FlashPaper 让Word文档变Flash
    AS3视频照相截图(转载)
    Json串到json对象的转换
    映射文件详解(转)
    Jquery .ajax方法分析(一)
  • 原文地址:https://www.cnblogs.com/oldtab/p/4442915.html
Copyright © 2011-2022 走看看