我正在尝试计算quicksort
的比较次数。对于最坏的情况,它显示n * n-1/2比较。因此对于8 7 6 5 4 3 2 1的8个输入,它应该是28个比较。但是,在我的程序中有30个比较。我试图打印比较,一切都很好,但最后的比较重复了三次。任何人都可以通过此代码找到错误吗?
#include<iostream.h>
#include<conio.h>
int ar[10000];
int pivot;
int temp;
int partition(int x, int y);
void quicksort(int f, int l);
int count = 0;
int i;
int index;
void main() {
clrscr();
int i;
for (i = 0; i < 8; ++i) {
cin >> ar[i];
}
quicksort(0, 7);
cout << "\nThe sum is " << sum;
getch();
}
void quicksort(int f, int l) {
if (f == l)
return 0;
if (f < l) {
pivot = partition(f, l);
quicksort(f, pivot - 1);
quicksort(pivot + 1, l);
}
}
int partition(int f, int l) {
index = ar[f];
i = f + 1;
for (int j = f + 1; j <= l; ++j) {
if (ar[j] < index) {
temp = ar[j];
ar[j] = ar[i];
ar[i] = temp;
++i;
}
}
i = i - 1;
temp = ar[f];
ar[f] = ar[i];
ar[i] = temp;
return i;
}
答案 0 :(得分:0)
您还可以使用任意容器的STL分拣机和比较器来简单地计算比较。
class LessCompare
{
public:
LessCompare() : m_counter ( 0u ) {}
template<typename T>
bool operator() ( T const& lhs, T const& rhs ) const {
++m_counter;
return lhs < rhs;
}
unsigned compares() const { return m_counter; }
private:
unsigend m_counter;
};
std::vector < T > container;
LessCompare compare;
std::sort ( container.begin(), container.end(), std::ref ( compare ) );
std::cout << "Compares: " << compare.compares() << std::endl;
但是,我很不确定std::sort
是否是快速排序。
您可以简单地改进 quicksort ,它使用任意仿函数进行比较并计算一些统计信息。
答案 1 :(得分:0)
对于HP / Microsoft的std :: sort,如果处于调试模式,则会进行两次额外的比较以检查比较是否为&#34;&lt;&#34;而不是&#34;&lt; =&#34;。它通过检查&lt; b,然后b <一个。如果您正在调试模式下构建,请尝试在发布模式下构建,看看它是否有帮助。