在std::sort()中完成的比较数 P> >如何在n个整数排序向量中,对标准C++ STL排序函数中发生的比较数进行计数? < P>一种快速、非侵入的方式是使用lambda函数。如果使用的是C++11或更高版本,则可以使用lambda,如下所示: unsigned int numComparisons = 0U; std::vector<unsigned int> someContainer; // Fill container, etc. std::sort( std::begin(someContainer), std::end(someContainer), [&numComparisons]( unsigned int lhs, unsigned int rhs ) { ++numComparisons; return lhs < rhs; } ); std::cout << numComparisons << " comparisons were performed in std::sort" << std::endl; 无符号整数比较=0U; 向量容器; //装满容器等。 排序( std::begin(someContainer), std::end(someContainer), [&numComparisons](无符号整数左侧,无符号整数右侧) { ++数值比较; 返回左侧

在std::sort()中完成的比较数 P> >如何在n个整数排序向量中,对标准C++ STL排序函数中发生的比较数进行计数? < P>一种快速、非侵入的方式是使用lambda函数。如果使用的是C++11或更高版本,则可以使用lambda,如下所示: unsigned int numComparisons = 0U; std::vector<unsigned int> someContainer; // Fill container, etc. std::sort( std::begin(someContainer), std::end(someContainer), [&numComparisons]( unsigned int lhs, unsigned int rhs ) { ++numComparisons; return lhs < rhs; } ); std::cout << numComparisons << " comparisons were performed in std::sort" << std::endl; 无符号整数比较=0U; 向量容器; //装满容器等。 排序( std::begin(someContainer), std::end(someContainer), [&numComparisons](无符号整数左侧,无符号整数右侧) { ++数值比较; 返回左侧,c++,sorting,C++,Sorting,一种快速、非侵入性的方法是使用lambda函数。如果使用的是C++11或更高版本,则可以使用lambda,如下所示: unsigned int numComparisons = 0U; std::vector<unsigned int> someContainer; // Fill container, etc. std::sort( std::begin(someContainer), std::end(someContainer), [&num

一种快速、非侵入性的方法是使用lambda函数。如果使用的是C++11或更高版本,则可以使用lambda,如下所示:

unsigned int numComparisons = 0U;
std::vector<unsigned int> someContainer;
// Fill container, etc.
std::sort( 
    std::begin(someContainer), 
    std::end(someContainer),
    [&numComparisons]( unsigned int lhs, unsigned int rhs ) 
    {
        ++numComparisons;
        return lhs < rhs;
    }
);

std::cout << numComparisons << " comparisons were performed in std::sort" << std::endl;
无符号整数比较=0U;
向量容器;
//装满容器等。
排序(
std::begin(someContainer),
std::end(someContainer),
[&numComparisons](无符号整数左侧,无符号整数右侧)
{
++数值比较;
返回左侧<右侧;
}
);

std::cout为了补充观察方法,你可以阅读。在复杂性方面,
std::sort
必须:

O(N·log(N)),其中N=标准::平均距离(第一次、最后一次)比较。 (直到C++11)

O(N·log(N)),其中N=标准::距离(第一个,最后一个)比较。 (从C++11开始)


显然,大O表示法可以掩盖一些常数因子,但一般来说,它与N·log(N)成比例(对数以2为基数,就像所有好的CS对数一样)。

为了补充观测方法,您可以阅读。在复杂性方面,
std::sort
必须:

O(N·log(N)),其中N=标准::平均距离(第一次、最后一次)比较。 (直到C++11)

O(N·log(N)),其中N=标准::距离(第一个,最后一个)比较。 (从C++11开始)


显然,big-O表示法可以掩盖一些常量因子,但一般来说,它与N·log(N)成比例(其中log是以2为基数的,就像所有好的CS日志一样).

您可以提供自己的函数进行标准比较,并计算调用次数。您可以提供自己的函数进行标准比较,并计算调用次数。注意:观察方法有助于了解实际发生的情况,但这也意味着您正在测量标准库对特定输入的
排序。如果其他一些标准库决定(比如)采用Python中的TimSort算法,并且您的输入已经大部分/全部排序,那么该排序的自适应性质可能会将比较工作减少到~
O(n)
,即使正常情况下的工作是
O(n log n)
,所以你的观察结果会产生误导性的观察结果。我完全同意ShadowRanger的观点,并鼓励读者也阅读他的答案。这在某种程度上取决于你为什么要测量它!与分析一样,使用真实的数据和环境进行分析是很重要的。注意:观察方法有助于了解实际情况,但也意味着您正在测量标准库对特定输入的排序。如果其他一些标准库决定(比如)采用Python中的TimSort算法,并且您的输入已经大部分/全部排序,那么该排序的自适应性质可能会将比较工作减少到~
O(n)
,即使正常情况下的工作是
O(n log n)
,所以你的观察结果会产生误导性的观察结果。我完全同意ShadowRanger的观点,并鼓励读者也阅读他的答案。这在某种程度上取决于你为什么要测量它!与评测一样,使用真实的数据和环境进行评测非常重要。我不知道“直到”和“自”之间的区别。大O上限不总是这样吗?那么,“平均值”(或其缺失)的含义是什么呢?@tobi303大O符号确实描述了N增长时的渐近上限。然而,在这种情况下,输入的顺序很重要,当对可能的顺序进行平均时,算法可以是O(N log(N)),但例如有O(N^2)的破坏性情况。C++11限制更严格,并且为所有可能的输入顺序指定了O(N log(N))。@ThomasRussell thx,我将不得不考虑一下。顺便说一句,log2(x)和log10(x)之间的差异只是一个常数,所以它是否是“好的CS日志”并不重要;)@托比303:是的。指出它是log2确实提醒您,在涉及其他常数因子之前,成本高于log10,但是的,差异是~3.32的常数因子,因此基数可以忽略。我没有得到“直到”和“自”之间的差异。大O上限不总是这样吗?那么,“平均值”(或其缺失)的含义是什么呢?@tobi303大O符号确实描述了N增长时的渐近上限。然而,在这种情况下,输入的顺序很重要,当对可能的顺序进行平均时,算法可以是O(N log(N)),但例如有O(N^2)的破坏性情况。C++11限制更严格,并且为所有可能的输入顺序指定了O(N log(N))。@ThomasRussell thx,我将不得不考虑一下。顺便说一句,log2(x)和log10(x)之间的差异只是一个常数,所以它是否是“好的CS日志”并不重要;)@托比303:是的。指出它是log2确实提醒您,在涉及其他常量因子之前,成本高于log10,但是的,差异是~3.32的常量因子,因此可以忽略基数。