如何在很大数量级的数据中(比如1个亿)筛选出前10万个最小值?之六

本文介绍了一种快速选择算法的C代码实现,通过递归过程将数据分成两组,适用于大规模数据集的高效筛选。举例说明了在ExcelHome网站上解决一亿取十万问题的应用案例,展示了其在大数据处理场景下的实际效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速选择

这是一种快速将数据分成两组的方法。类似快速排序算法。在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秒。速度也非常快。

 

转载于:https://www.cnblogs.com/oldtab/p/4442915.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值