我必须按降序对数组进行部分排序,其中某些数字可能已经排序。
他们的任何功能是否可以有效地执行它或任何有效的算法。
答案 0 :(得分:7)
Timsort是专为此案例设计的。
Timsort是一种混合排序算法,源自合并排序和 插入排序,旨在在各种现实世界中表现良好 数据。它是Tim Peters在2002年发明的,用于Python 编程语言。该算法查找数据的子集 已经订购,并使用子集对数据进行更多排序 有效。
另一种选择是Smoothsort,也是为了利用部分排序的数据而设计的。
这是Edsger Dijkstra在1981年开发的一种变型。 与heapsort一样,smoothsort的上限是O( n log n )。该 smoothsort的优点是,如果更接近O( n )时间 输入已经在某种程度上排序,而heapsort平均值 O( n log n ),无论初始排序状态如何。
答案 1 :(得分:0)
std::sort
一般。
虽然确切的实现细节是实现的质量,但std::sort
的良好实现应该利用数据的部分排序特性。例如libc++
。
请注意,如果您知道已排序的片段在哪里,则可以使用std::inplace_merge
。例如,假设v
是vector
并且[1,7]被排序,[7,10]也被排序,那么你可以使用std::inplace_merge(v.begin() + 1, v.begin() + 7, v.begin() + 10)
但是这更多错误 - 易发生。
关于结果的顺序:如果<
不适合你,请随意提供自己的比较功能。
答案 2 :(得分:0)
如果您在循环内进行排序,请考虑使用treap或红黑树。 Treaps的平均速度很快(但标准偏差较大),红黑树的运行时间变化较小(平均运行时间不太好,但运行时间标准偏差较小)。 IOW,对于批处理应用程序使用treap,对于交互式应用程序,您可能需要一个红黑树,因此您的用户不必等待很长一段时间。
如果你没有在循环中排序,那么Timsort。