部分排序一些数字已经排序的数组

时间:2012-07-03 12:33:02

标签: c++ algorithm sorting

我必须按降序对数组进行部分排序,其中某些数字可能已经排序。

他们的任何功能是否可以有效地执行它或任何有效的算法。

3 个答案:

答案 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。例如,假设vvector并且[1,7]被排序,[7,10]也被排序,那么你可以使用std::inplace_merge(v.begin() + 1, v.begin() + 7, v.begin() + 10)但是这更多错误 - 易发生。

关于结果的顺序:如果<不适合你,请随意提供自己的比较功能。

答案 2 :(得分:0)

如果您在循环内进行排序,请考虑使用treap或红黑树。 Treaps的平均速度很快(但标准偏差较大),红黑树的运行时间变化较小(平均运行时间不太好,但运行时间标准偏差较小)。 IOW,对于批处理应用程序使用treap,对于交互式应用程序,您可能需要一个红黑树,因此您的用户不必等待很长一段时间。

如果你没有在循环中排序,那么Timsort。