//问题解决了。我很困惑在哪里添加计数器来报告数量 比较。它总是保持固定的数字,永远不会改变。假设每次程序运行时向量都包含两位数的随机数。 //
编辑:新问题。我不确定计数器增量是否在插入排序和选择排序的正确位置。 代码粘贴在安全链接上: http://ideone.com/Bk90du
int insertionSort(vector<int> &v)
{
// Variables
int temp, i, j, counter;
counter = 0;
for (i = 1; i < v.size(); i++)
{
temp = v[i];
j = i-1;
while(temp < v[j] && j >= 0)
{
v[j+1]=v[j];
j--;
counter++; // tracking # of comparisons.
}
v[j+1]=temp;
}
return counter; // return counter
}
答案 0 :(得分:0)
根据(现已删除)评论,这是main()
:
int main() {
int numCount;
vector<int> myVector2(myVector);
insertionSort(myVector2);
cout << endl << endl;
cout << "Vector after Insertion Sort: ";
printVector(myVector2);
cout << endl << endl;
numCount = insertionSort(myVector2);
cout << "Number of comparisons: " << numCount;
您对同一向量进行了两次排序,并打印第二次排序运行的比较计数。当向量已经排序时,比较的数量等于向量中的元素数量,因为不需要做任何工作。
要获得真实的比较次数,请将main()
更改为:
int main() {
int numCount;
vector<int> myVector2(myVector);
numCount = insertionSort(myVector2);
cout << endl << endl;
cout << "Vector after Insertion Sort: ";
printVector(myVector2);
cout << endl << endl;
cout << "Number of comparisons: " << numCount;
答案 1 :(得分:0)
在不知道您的测试用例是什么的情况下,无法评论他们执行的比较次数。如果所有情况都具有相似的属性,则代码很可能表现得如此。
编辑:以下添加以回应OP在声明中声称测试用例是包含100个随机生成的两位数元素的向量。
如果您在评论中说过,您的测试用例涉及具有100个随机两位数值的向量,那么counter
的值将取决于元素的“未排序”(尽可能小的值)与元素数量有关)。假设您的所有测试用例都是相同的大小,那么counter
的值唯一的方法就是在调用函数之前对向量进行类似的排序。例如,如果所有向量都按升序和相同大小预先排序,则每个测试用例将给出完全相同的返回值。类似地,如果所有向量都按降序和相同大小预先排序,则每个测试用例将给出完全相同的返回值(尽管与最初返回时返回的值不同)。
因此,我不相信您对测试用例是随机的评论。它们可能以某种方式预先排序(或者可能是部分排序)。例如,您可能会为每个测试用例调用两次函数,并且仅在第二次调用后打印出count
的值.....当向量是(如果您的代码表现得如此)已经预排序。
结束修改
也就是说,代码中的变量counter
正在累积执行while
循环体的次数。这与正在执行的比较次数无关,因为在该循环的主体中没有执行比较。它与插入次数有关,而与比较次数无关。
如果通过“比较”,您希望平均评估表达式temp < v[j]
(与其他表达式不同,例如i < v.size()
或j >= 0
,这也可以在代码中称为比较)那么你可能会考虑做类似
while (++counter && temp < v[j] && j >= 0)
并从循环体中删除counter
的递增。
由于counter
初始化为零,因此将计算temp < v[j]
的评估次数(++counter
将始终产生非零结果)。请注意,由于temp < v[j]
可能为false,因此不会计算计算j >= 0
的次数。