跟踪排序

时间:2016-05-31 20:18:49

标签: c++ sorting comparison

我正在尝试跟踪为简单的c ++排序函数进行的比较量。

void sort(int arr[], int size)
{

int startScan, minIndex, minValue;

for (startScan = 0; startScan < (size - 1); startScan++)
{
    minIndex = startScan;
    minValue = arr[startScan];

    for (int index = startScan + 1; index < size; index++)
    {
        if (arr[index] < minValue)
        {
            minValue = arr[index];
            minIndex = index;
        }
    }
    arr[minIndex] = arr[startScan];
    arr[startScan] = minValue;
}



}

我正在玩我认为可能会返回比较次数的值,并且最初可能会认为比较的数量会在startScan中保留。当然不是,开始扫描只会持有最大尺寸-1。这绝对不是比较的数量。

我想也许会在变量索引中找到它。所以我创建了int temp = index;,因为我很懒,并且不想完成它,但果然当我返回temp的值时,它也只是size-1。不知道为什么我期待任何不同,但我想我会尝试。

然后我开始思考它...我甚至知道比较发生在哪里?

原来我不知道我是否这样做。我认为我的所有比较都发生在第二个for循环中, for (int index = startScan + 1; index < size; index++),即使那时只是嵌套在里面的if语句。

只要if语句运行,它就会比较一些东西。我想,SWEET。所以我在我的函数顶部创建了int temp = 0;,在if语句中打了一个temp++,并且认为它会给我比较数。

这次给了我一个令人鼓舞的数字。当对13个数字的随机列表进行排序时(随机选择随机数),我的temp返回值为18.据我所知,对我来说,与我的任何其他数字没有线性关系。

所以这是我真正的问题。这有用吗?我的最终代码是否按照我的意愿行事,并且确实返回了比较的数量?或者我只是发现了另一个任意数字,我恰好比其他测试产生的其他数字更喜欢。我不知道如何手动计算比较次数。我喜欢这个号码,但是据我所知,它可能已经过时了。

最终代码:

int sort(int arr[], int size)
{
int temp = 0;
int startScan, minIndex, minValue;

for (startScan = 0; startScan < (size - 1); startScan++)
{
    minIndex = startScan;
    minValue = arr[startScan];

    for (int index = startScan + 1; index < size; index++)
    {
        if (arr[index] < minValue)
        {
            minValue = arr[index];
            minIndex = index;
            temp++;
        }


    }
    arr[minIndex] = arr[startScan];
    arr[startScan] = minValue;
}

return temp; 


}

1 个答案:

答案 0 :(得分:2)

仅当数组值小于minValue时才增加计数器:

    if (arr[index] < minValue)
    {
        minValue = arr[index];
        minIndex = index;
        temp++;
    }

如果您想计算所做的arr[index] < minValue次比较次数,则应将代码更改为:

    if (arr[index] < minValue)
    {
        minValue = arr[index];
        minIndex = index;
    }
    temp++;

也许给柜台一个更好的名字,counter呢? ;)

顺便说一句,如果您想要将您的排序与std::sort进行比较,您可以计算出这样的比较次数:

#include <algorithm>
#include <iostream>

bool myCountingCompare(int a,int b){
    static int counter = 0;
    counter++;
    std::cout << "number of comparisons : " << counter << std::endl;
    return a > b;
}

int main() {
    int array[3] = {1,2,3};
    std::sort(&array[0],&array[3],myCountingCompare);
    return 0;
}