- 第k大
- 2015-01-13 13:02:23 @
题目要求的不是求**第k大**的数么
这样的话样例600,600,350,420,380,
第1大的数是600;
第2大的数不应该是420么?
第3大就应该是380才对0.0
所以感觉快排完以后应该有一段比较
i:=n;
temp:=score[i];
sum:=1;
repeat
dec(i);
if score[i]<>temp then begin inc(sum); temp:=score[i]; end;
until (i=1) or (sum=k);
writeln(temp);
而不应该只是**简单的** writeln(score[n-k+1]);
3 条评论
-
wanghongrui1 LV 8 @ 2016-08-27 09:02:45
两个600都是第一名,那么420就是第三名了
-
2015-08-01 09:29:25@
像比赛排名一样
两个600都是第一
420就是第三了 -
2015-01-13 18:03:32@
笨,如果这是分数,我拿了420分,我问你,我是第二名?
同样的道理
其实我仔细分析了此题
根本不需要快排,墨守陈规
冒泡排序每一次执行都可以把一个最大或者最小的数弄到一端,因此可以利用K次数的冒泡就可找到第K大,不需要完整排列出来。而快排如果要优化进入一边递归寻找K位置很麻烦。而且快排本来就写的很麻烦!
此题可以计数排序,拿空间去换时间,非常超值!
- 1