Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何计算循环签入条件的次数_C_Sorting_For Loop - Fatal编程技术网

C 如何计算循环签入条件的次数

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--) {

我正在写一个插入排序程序

我想知道检查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--)
             {
                 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;
    }
  }