选择数组中的10个最大值

sim*_*ona 0 sorting algorithm fortran quicksort fortran90

我想在fortran 90中选择数组中的10个最大值(size~1e9元素).这样做的最有效时间是什么?我正在研究有效的排序算法,它是要走的路吗?我需要对整个阵列进行排序吗?

das*_*ght 5

对10 9个元素进行排序从顶部选择10 1听起来像一个过度杀伤:log 2 N因子将大约为30,并且排序过程将移动大量数据.

为结果创建一个包含十个项目的数组,用大数组中的前十个元素填充它,并对10个元素的数组进行排序.现在从元素11开始遍历大数组.如果当前元素大于10元素数组中的最小项,找到插入点,移动十元素数组以为新元素腾出空间,并将其放入阵列.完成大数组后,小数组包含十个最大值.

对于"较大的十个值",您可以通过切换到最大堆数据结构来显着提高性能.从大数组的前十个项构造一个堆; 存储最小的数字以供将来参考.然后对于堆中最小数字之上的大数组中的每个数字,到目前为止执行以下操作:

  • 用新号码替换最小的号码,
  • 按照堆结构到根,将数字放在正确的位置,
  • 将新的最小数字的位置存储在堆中.

完成后,堆将包含大数组中的十个最大项.

  • @PaulHankin"对于较大的10值,这个算法效率可能很低"非常酷:-)有十个或更少的项目几乎无关紧要,因为你的写入大部分都会在缓存中发生.在最坏的情况下,max-heap可能会快两倍,但在随机的情况下,它可能是一个清洗. (2认同)