快速排序与快速选择算法(quick sort and quick select algorithm)

飞燕之家上的一道排序题:

 

题目描述:
某市重点高中很有名气,它在计算录取分数线的时候,
采用以下办法:总人数乘以录取百分比,得到录取人数k后,
从最高分开始数k个人,这个人的中考分数就作为
这所学校的录取分数线了。

输入:
有多个测试点,每个测试点第一行是n和k(k<=n),
n是总人数,总人数不超过1e6,k是录取的人数
第二行就是n个学生的中考分数,由于采用一种
特殊的标准计分方式,分数范围在0至1e8

输出:
对每个测试点输出对应的分数线,一个结果一行

样例输入:
7 3
1 2 3 4 5 6 7

样例输出:
5


 

最开始用插入,第三组用例超时

 

 

Test  1:    Accepted    Time = 0 ms
Test  2:    Accepted    Time = 48 ms
Test  3:    Time Limit Exceed
--------------------------------
Problem ID     ct8_2
Test Result    Time Limit Exceed
Time Limit     5000 ms
Total Memory   5416 Kb / 65000 Kb
Code Length    1066 Bytes

 


 

后来改为统计第n大的数,直接输出。。本以为减少了内存读写操作能好些,结果第二组用例居然更慢了。。。

 

  

 

 

Test  1:    Accepted    Time = 0 ms
Test  2:    Accepted    Time = 68 ms
Test  3:    Time Limit Exceed
--------------------------------
Problem ID     ct8_2
Test Result    Time Limit Exceed
Time Limit     5000 ms
Total Memory   4000 Kb / 65000 Kb
Code Length    905 Bytes

 

 

后来改为快速排序,这回快了一些,但是第四组用例仍然超时:

 

 

 

 

Test  1:    Accepted    Time = 0 ms
Test  2:    Accepted    Time = 26 ms
Test  3:    Accepted    Time = 4246 ms
Test  4:    Time Limit Exceed
--------------------------------
Problem ID     ct8_2
Test Result    Time Limit Exceed
Time Limit     5000 ms
Total Memory   4032 Kb / 65000 Kb
Code Length    934 Bytes

 

由于快速排序导致大量递归浪费时间空间,所以考虑要减少递归次数。由于要找第n大的数,所以没有必要对所有数据都排序,又找到了快速选择算法。。

 

 

 

 

终于。。。。

 

 

Test  1:    Accepted    Time = 0 ms
Test  2:    Accepted    Time = 21 ms
Test  3:    Accepted    Time = 3187 ms
Test  4:    Accepted    Time = 3248 ms
--------------------------------
Problem ID     ct8_2
Test Result    Accepted
Total Time     6456 ms
Total Memory   4032 Kb / 65000 Kb
Code Length    1030 Bytes

 

后记:这题做了整整两天提交了n多次,没心思再细抠了。。

快速选择算法描述是看老外写的,看得不一定明白。。链接如下

http://www.ics.uci.edu/~eppstein/161/960125.html

 

也不知道是不是这么回事,

另外看别人提交的答案有个强悍的家伙四组用例一共才用不到1500ms,

我这个排序写得肯定很傻,请高手指出问题,我爱你们

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值