求数组中第k小的数,或者最小的k个数

一:利用快速排序的思想,可以在O(n)的时间复杂度下解决问题,

为什么是O(n)呢,它是这么相加的n+n/2+n/4+n/8+...=2n所以是O(n),

这种方法会改变原数组的顺序。

二:另外还有一种nlong(k),特别适合处理海量数据

首先创建一个k大小的容器,这个容器建议使用二叉树,或者最大堆来实现,每次查找容器中最大数,删除最大数,插入新数。操作需要log(k)的时间。所以总的时间复杂度时nlong(k)。

二叉排序树,查找,删除,插入都是log(n)

堆,查找最大只需O(1),删除,插入都是log(n)


还有平衡二叉树,B+,B-树,红黑书,都是二叉排序树的变体,但是更稳定,平衡性更好。


第一种的详细解答如下:

给定线性序集中n个元素和一个整数k1≤k≤n,要求找出这n个元素中第k小的元素。

数组第7小元素  A[1:9]=[65,70,75,80,85,60,55,50,45]

partition[1:9]=[60,45,50,55,65,85,80,75,70]  j=7 q=5

[6:9]=[85,80,75,70]  j=2

partition[6:9]=[70,80,75,85]  j=2 q=4

[6:8]=[70,80,75]  j=2

partition[6:8]=[70,80,75]  j=2 q=1

[7:8]=[80,75]  j=1


int randomizedSelect(int *a, int L, int R, int k)
   {
      if (L == R) return a[L];
      int i = randomizedpartition(L, R),
      j = i – L + 1;
      if (k <  j) 
          return randomizedSelect(a, L, i - 1, k);
      else
         return randomizedSelect(a, i, R, k – j);
   }

最坏时间复杂度: O(n2)

平均时间复杂度:O(n)




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zlingh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值