C 如何计算循环签入条件的次数
我正在写一个插入排序程序 我想知道检查for循环中的“条件,即C 如何计算循环签入条件的次数,c,sorting,for-loop,C,Sorting,For Loop,我正在写一个插入排序程序 我想知道检查for循环中的“条件,即a[k]>temp”的时间,以确定进行比较的次数 如何找到它 int i,j,k,moves=0,comparison=0; for(j=1;j<arr_length;j++) { temp=a[j]; for(k=j-1;k>=0 && a[k]>temp;k--) {
a[k]>temp
”的时间,以确定进行比较的次数
如何找到它
int i,j,k,moves=0,comparison=0;
for(j=1;j<arr_length;j++)
{
temp=a[j];
for(k=j-1;k>=0 && a[k]>temp;k--)
{
moves+=1;
a[k+1]=a[k];
a[k]=temp;
}
}
printf("No. of Moves%d",moves);
printf("Comparisons%d",comparison);
inti,j,k,moves=0,comparison=0;
对于(j=1;j=0&&a[k]>temp;k--)
{
移动+=1;
a[k+1]=a[k];
a[k]=温度;
}
}
printf(“移动次数%d”,移动次数);
printf(“比较%d”,比较);
我会将比较'a[k]>temp'放入一个递增计数器的函数中
bool check( int &counter, int lhs, int rhs )
{
++counter;
return lhs > rhs;
}
获取正确值的最简单方法是在逗号分隔的列表中使用附加变量:
size_t count= 0;
for(k=j-1;k>=0 && ( count++ , a[k]>temp ) ; k--)
这将计算
count++
和a[k]>temp
,但比较中使用的值将仅为a[k]>temp
您已经拥有k
。使用它
在
for()
循环之后,如果k>=0
,则从k
[此处j-1
]的初始值中减去k
的当前值。这将为您提供执行a[k]>temp
[for()
loop condition check]的次数。首先,所有问题的根源都是模糊的循环。首先,将您的程序修复为可读性更强的程序,其中3个循环语句保持简单。此外,请始终从0开始计数,否则您将一次又一次地被数组索引错误烧死
int moves = 0;
int comparisons = 0;
for(int j=0; j<arr_length; j++)
{
temp = a[j+1];
for(int k=j; k>=0; k--)
{
comparisons++;
if(a[k] <= temp)
{
break;
}
moves++;
a[k+1]=a[k];
a[k]=temp;
}
}
int moves=0;
整数比较=0;
对于(int j=0;j=0;k--)
{
比较++;
if(a[k]变量moves
只记录元素交换的次数。它不用于检查进行比较的次数。@Poo我已经编辑了答案,但希望您理解大意。是的,我知道了您的想法,我在代码中用comparison++
替换了count++
,但没有得到正确答案正确答案,即arr_长度*(arr_长度-1) / 2@Poo逗号分隔的计数器工作正常。可能您的一些假设是错误的。它工作了,只需要再多一行就可以了。将代码放在这里…int i,j,k,moves=0,comparison=0,temp_cmp=0;for(j=1;j=0&(temp_cmp++,a[k]{Typ);k-){+=1;A[k+2]=a[k];a [k]=TEMP;}比较+= TungCMP;}Prtf(“移动%d”的数目,移动);PrimTf(“比较%d”),比较有点臃肿。这不是C++。
size_t count= 0;
for(k=j-1;k>=0 && ( count++ , a[k]>temp ) ; k--)
int moves = 0;
int comparisons = 0;
for(int j=0; j<arr_length; j++)
{
temp = a[j+1];
for(int k=j; k>=0; k--)
{
comparisons++;
if(a[k] <= temp)
{
break;
}
moves++;
a[k+1]=a[k];
a[k]=temp;
}
}