ベクトルをいくつかの等しいセクションに分割します。量は、必要な進捗レポートの粒度によって異なります。各セクションを個別に並べ替えます。次に、とのマージを開始しstd::merge
ます。各セクションを並べ替えた後、および各マージ後に、進捗状況を報告できます。マージと比較して、セクションの並べ替えをカウントする割合を決定するために実験する必要があります。
編集:
私は自分でいくつかの実験を行い、ソートと比較してマージは重要ではないことがわかりました。これは私が思いついた関数です。
template<typename It, typename Comp, typename Reporter>
void ReportSort(It ibegin, It iend, Comp cmp, Reporter report, double range_low=0.0, double range_high=1.0)
{
double range_span = range_high - range_low;
double range_mid = range_low + range_span/2.0;
using namespace std;
auto size = iend - ibegin;
if (size < 32768) {
stable_sort(ibegin,iend,cmp);
} else {
ReportSort(ibegin,ibegin+size/2,cmp,report,range_low,range_mid);
report(range_mid);
ReportSort(ibegin+size/2,iend,cmp,report,range_mid,range_high);
inplace_merge(ibegin, ibegin + size/2, iend);
}
}
int main()
{
std::vector<int> v(100000000);
std::iota(v.begin(), v.end(), 0);
std::random_shuffle(v.begin(), v.end());
std::cout << "starting...\n";
double percent_done = 0.0;
auto report = [&](double d) {
if (d - percent_done >= 0.05) {
percent_done += 0.05;
std::cout << static_cast<int>(percent_done * 100) << "%\n";
}
};
ReportSort(v.begin(), v.end(), std::less<int>(), report);
}