c – 从非常大的未排序列表中获取最大X数的最快方法?

前端之家收集整理的这篇文章主要介绍了c – 从非常大的未排序列表中获取最大X数的最快方法?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试从我的程序生成的分数列表中获得100分.不幸的是,这个列表是巨大的(数百万到数十亿),所以排序是程序的一个时间密集的部分.

做排序的最佳方法是获得前100名成绩?

到目前为止,我可以想到的唯一的两种方法是先将所有分数全部生成一个庞大阵列,然后将其排序并排在前100位.或者第二,生成X个分数,排序并截断前100个分数,然后继续产生更多分数,将它们添加到截断的列表中,然后再次排序.

无论哪种方式,我都会这样做,还需要更多的时间比我想要的任何想法如何以更有效的方式做到这一点? (我从来没有参加过编程课程,也许那些具有comp sci学位的人都知道有效的算法来做到这一点,至少这是我希望的).

最后,在c中使用标准sort()函数的排序算法是什么?

谢谢,

-Faken

编辑:只是为任何人好奇…

我在前后做过几次试验,结果如下:

旧程序(每个外循环迭代后的预制排序):

top 100 scores: 147 seconds
top  10 scores: 147 seconds
top   1 scores: 146 seconds
Sorting disabled: 55 seconds

新程序(只执行跟踪最高分,并使用默认排序功能):

top 100 scores: 350 seconds <-- hmm...worse than before
top  10 scores: 103 seconds 
top   1 scores:  69 seconds 
Sorting disabled: 51 seconds

新的重写(数据存储优化,手写排序算法):

top 100 scores: 71 seconds <-- Very nice!
top  10 scores: 52 seconds
top   1 scores: 51 seconds
Sorting disabled: 50 seconds

完成在一个核心2,1.6 GHz …我不能等到我的核心i7 860到达…

对于我来说,还有很多其他更加积极的优化(主要是在减少我运行的迭代次数的方面),但是像现在这样,速度还不够好,我甚至不会打扰制定出这些算法优化.

感谢eveyrone的输入!

解决方法

获取前100个分数,并将它们排列在数组中.
>取下一个分数,并将其插入到数组中(从“小”结尾开始)
>删除第101个值
>继续下一个值,在2,直到完成

随着时间的流逝,这个列表将会越来越像100个最大的值,所以更多的时候你会发现插入排序立即中止,发现新值小于前100名候选人的最小值.

猜你在找的C&C++相关文章