从1亿个整数中找出最大的1万个

这是比较常见的一个面试题了.

 

看到一篇比较好的文章,留下网址和阅读笔记.

地址:http://blog.csdn.net/shadowkiss/archive/2008/12/19/3557873.aspx

 

其中针对问题,算法上进行不断地优化,是一大亮点,其优化过程包括:

 

不假思索
        stupid,[选择排序]每次找出余下数组中最大的,重复1万次. 

 

稍作思考
        快排后,提取前一万个.
 
深入思考
        最先抽取头部1万个整数作为resultArr(排序后,找出其中最小数),之后遍历余下数据BigArray,发现有比最小数据大的,覆盖之,并重新找出最小元素,如此反复,直至bigArray遍历完全.
        ps.最小元素的查找是优化重点,注意缩减查找范围.下面的优化都集中在这里.

 

深思熟虑
        最小元素的查找在一定范围内进行,先按左大右下排列初选出的ResultArr数组,第一次最小元素指向ResultArr的尾端,每替换一次,后移一位,查找范围加一.

 

苦思冥想
        每次的替换操作会导致resultArr无序,在替换一定次数后,重新整理resultArr,用归并使之有序.

 

殚思极虑
        替换操作 只会导致尾部局部数据无序,只需先排序该部分数据,之后进行有序数据的合并.

 

ps.以上都是我自己阅读后的缩写,留待日后复习之用,很难想象不认真阅读原文能看出任何体会.

 

ps2.当然了,我自己也有一个思路完全不同的解法,主要思想是以快排为原型,但稍作修改.

       每次按快排寻找到支点后(按从小到大),对支点左右的element个数进行判断,如若右边个数小于需要找出的元素个数,则只对支点左边的数组递归调用快排.如此反复,直至右边元素达到指定个数.至于实际的代码实现,待完成

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值