我正在尝试跟踪为简单的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;
}
答案 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;
}