【算法题集锦之一】--给定只能排序5个数的方法,找出25个数中的前四个

这篇博客探讨了一道面试题,涉及到使用最多能排序5个数的方法来确定25个无序数中的前4个最大值。通过将25个数分为5组进行初步排序,然后逐步筛选,最终得出只需8次排序的解决方案。博主分享了详细的解题思路,并提供了Java实现的代码示例。
摘要由CSDN通过智能技术生成

转眼间大学毕业了,找工作的过程不是很顺利,虽然也面过几家知名的互联网企业(阿里,PPTV等)且坚持到了终面,但还是以失败告终,除了运气成分之外,更多的还是因为自己的算法钻研的不够深,故产生了这个想法:通过写一系列关于算法的博客来提高自己的算法水平,希望自己能坚持下去。

这道题目是我在面试PPTV时,面试官出的一道题,据说是原百度的校招题:即25匹赛马,只有五条跑道,问需要比赛几次才能确定前5匹马。

不过面试官换了一种描述:

给定一个方法sort,每次最多排序5个数,
只使用该排序方法,给定25个无序的数,
问需要调用sort方法几次可以得到前4个数。

这道题难度适中,不算很难,一般都能得到一种解法,但是得到最优解还是要思考一下的。

25个数需要得到前4个数,不管怎样这25个数肯定都要比较一遍,所以第一步的话很容易想到:将25个数分成五组,对五组分别进行排序,得到五组有序的数组。

比较容易想到的一种解法如下:

5组数组都已经有序了,每一组的最大数都是已知了,接下来只需要取每组的第一个数进行排序,就能获得一个要求的数(逐个获取最大的数),去除这个数,然后再如此反复比较(即每一次都取每组中的第一个数进行排序,就能依次获得第二个数,第三个数,和第四个数),这样总共需要9次排序。下面的图说明了一种可能出现的排序情况




同理,最后一次排序(即第九次排序)也是重复这个过程,到第九次就可以获得前四个数了。

当然,九次排序明显不是最优解,因为在这九次排序中我们做了多余的比较,注意到题目只需要取前四个数,当第六次排序后。我们就可以排除掉一些不可能的数据,很显然,第五组中的数是可以排除的,因为第五组中最大的数也只可能是第五大的数(前四组的第一个数都比它大),同理,第四组的后四个数也是不可能的,第三组的最后三个,第二组的最后两个和第一组的最后一个数,这些数都可以排除。

排除了这些数以后,我们就可以减少排序次数了,第六次排序后可以排除:1、已经确定的最大的数 2、上面列举出来的数(共15个)

这样第六次排序后还需要比较的数只剩下9个了,如下图。


剩下的9个数中还需要比较出前三个数来,只需要两次排序即可。

 第七次排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值