调用自定义排序函数的次数

Number of times the custom sort function is called

本文关键字:函数 自定义 排序 调用      更新时间:2023-10-16

我有一个对象v的向量,它用自定义函数sortproc:排序

std::sort(v.begin(), v.end(), sortproc);

在对数组进行排序之前,我想提前知道sortproc将被调用多少次。

我试过什么?我尝试克隆矢量,然后对副本进行排序,并计算调用sortproc的次数。我通过增加计数器来实现这一点。然后,在对副本进行排序后,我读取计数器的值,并再次对原始向量进行排序。这是有效的,但效率很低,因为它把整个工作做了两次。有可能以更有效的方式做到这一点吗?

几乎可以肯定不是。脑海中浮现的两个障碍是:

1) 该标准没有定义std::sort使用什么算法,因此可移植代码除了尝试之外,无法确切知道执行了多少比较

2) 即使你知道算法,我认为对于明智的排序算法来说,计算出所需的比较次数不会比计算出反转次数更容易,反转次数本身与排序具有相同的复杂性。因此,你不会得到一个更高效的解决方案。

2的解决方法是,如果sort算法使得比较次数不取决于数据的排序程度,而只取决于数据大小。设计具有该属性的排序算法并不太难。它可能不如"真正的"排序算法高效,但很可能比两次排序更高效。

因此,例如在合并排序中,通常当合并的一侧用尽时,您会将另一侧的剩余部分直接复制到目标中。如果在那一点上,你只为了弥补数字而进行了一堆额外的冗余比较,那么比较的数量就不会取决于输入的顺序。在最坏的情况下,毫无意义的比较数量将是总数的一半,所以它不应该比排序两次更糟糕。不过,这与std::sort的比较并不"公平",因为合并排序无论如何都不是std::sort的有效算法:它使用了太多额外的内存。

排序网络也使用固定数量的比较,但对std::sort也没有好处,因为你需要知道设计网络的项目数量。。。