我怎么知道计数器增量是否在正确的位置来跟踪比较数~C ++?

时间:2016-04-15 09:54:56

标签: c++ function sorting vector insertion

//问题解决了。我很困惑在哪里添加计数器来报告数量 比较。它总是保持固定的数字,永远不会改变。假设每次程序运行时向量都包含两位数的随机数。 //

编辑:新问题。我不确定计数器增量是否在插入排序和选择排序的正确位置。 代码粘贴在安全链接上: 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 
}

2 个答案:

答案 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的次数。