腾讯-1亿个数据取前1万大的整数-题解答

 

在 排头兵 的博客中看到 这篇文章, 《腾讯-1亿个数据取前1万大的整数-题解答 》 。做了下分析,当做学习之用。

 

题目描述】:1亿个数据取前1万大的整数

 

博客中给出的两种排序方法:

 

F1, 使用快速排序。快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次扫描只能确保最大数值的数移 到正确位置,而待排序序列的长度可能只减少1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。然后又用 同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。

快速排序是不稳定的,最理想情况算法时间复杂度 O(nlog2n),最坏O(n^2)。

 

 

F2, 排头兵给出的排序方法。思路请参考他的 原文

就是将数组分成m个子数组(n/m),然后用冒泡法取出每个子数组的最大值。最后遍历整个数组n,每个数组元素和$max数组比对,最后得出的$max数组就是要得到的结果。其中一个细节需要注意,就是遍历整个数组N与$max 比对的时候,如果 $i 元素 大于 min($max)。则从 max($max) 倒序的比对下来。

 

F3, 我在测试以上代码的时候,发现 F2中比对从 min->max 的转换有些别扭。因此做了修改,即如果 $i 元素大于 min($max),则继续比较下一个 $max[1]($max 中第二小的),如果 $i > $max[k], 则替换 k-1 。我的想法是,因为max数组时每个子数组中最大元素的集合,并且做了排序。那么在整个数组N中,很少有元素会大于 $max中的元素了。即使难得有一个大于 min($max),这个元素也很难打过第二小的。。。根本不会有打过 max($max)。因此F2中从大到小的比较,就多出了一些比对的次数了。

 

 

 

 

以下是三种方法的执行结果:

10000个元素取 100个最大值。因此分为 100个子数组。

 

 

 

 

以下贴出我的测试代码(在排头兵代码的基础上进行修改):

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值