随机唯一整数的非标准排序算法

Rei*_*ins 2 c++ arrays sorting algorithm

我有一个至少2000个随机唯一整数的数组,每个整数的范围为0 <n <65000.

我必须对它进行排序,然后获取数组中随机值的索引.这些操作中的每一个都必须尽可能快.对于搜索二进制搜索似乎很好.

对于排序我使用了标准的快速排序算法(qsort),但我被告知,使用给定的信息,标准排序算法将不是最有效的.所以问题很简单 - 使用给定的信息对数组进行排序的最有效方法是什么?对此完全感到困惑.

Ste*_*sop 7

我不知道为什么那个告诉你的人会如此反对神秘,但实际上qsort并不是用C++对整数(或者通常是任何东西)进行排序的最有效方法.请std::sort改用.

这是可能的,你可以提高你的执行的std::sort对所陈述的特殊情况(范围0-65k 2000个不同的随机整数),但你不可能做的好多了,它几乎可以肯定不会是值得的.我能想到的事情可能会有所帮助:

  • 使用快速排序,但使用不同的数据透视表选择或不同的阈值,可以根据您的实现sort使用情况切换到插入排序.这基本上是修补.

  • 使用某种并行类型.2000元素是如此之小,我怀疑创建额外线程的时间将立即杀死任何性能改进的希望.但是如果你做了很多种类,那么你可以平均在所有这些中创建线程的成本,并且只担心线程同步的开销而不是线程创建.

也就是说,如果你对数组进行生成和排序,然后在其中只查找一个值,然后生成一个新数组,那么每次排序整个数组都会浪费精力.您可以在数组中运行,计算小于目标值的值的数量:此计数是它将具有的索引.使用std::count_if或短循环.

这些操作中的每一个都必须尽可能快.

这不是合法的软件工程标准.经过足够数月或数年的工程努力,几乎任何事情都可以变得更快 - 没有任何复杂的事情可以"尽可能快",即使它是你也无法证明它不会更快,并且即使你可以在某处或很快发明新的硬件,其中最快的解决方案是不同的和更好的.除非你打算一生都在完成这项任务并最终失败,否则要获得更现实的目标;-)