如何在排序时弄清楚"进度"?

Meh*_*dad 9 c++ sorting algorithm progress

我正在用它stable_sort来分类vector.

排序需要几秒钟(比如说5-10秒),我想向用户显示一个进度条,显示到目前为止已完成的排序量.

但是(即使我要编写自己的排序例程)我怎么能说出我取得了多大的进展,还剩下多少呢?

我不需要它是准确的,但我需要它是"合理的"(即合理的线性,不是伪造的,当然也不是回溯).

ric*_*ici 6

标准库排序使用用户提供的比较功能,因此您可以在其中插入比较计数器.quicksort/introsort或mergesort的比较总数将非常接近log 2 N*N(其中N是向量中元素的数量).这就是我导出到进度条的内容:比较次数/ N*log 2 N.

由于您使用的是mergesort,因此比较计数将非常精确地衡量进度.如果实现花费时间在比较运行之间置换向量,它可能略微是非线性的,但我怀疑你的用户会看到非线性(并且无论如何,我们都习惯于不准确的非线性进度条:)).

Quicksort/introsort会显示更多的变化,具体取决于数据的性质,但即使在这种情况下,它总比没有好,你总是可以根据经验添加一个软糖因子.

比较课程中的一个简单计数器几乎不会花费你.就个人而言,我甚至不打扰它(锁会伤害性能); 它不太可能进入一个不一致的状态,无论如何进度条不会开始放射蜥蜴只是因为它得到一个不一致的进度数.