在这个冒泡排序代码中,这些变量c&d在C中意味着什么?

xyz*_*123 8 c arrays sorting

所以我理解升序泡泡排序检查索引i是否大于索引"i + 1",如果是,则它交换位置,然后继续前进直到它到达循环结束,然后循环重新开始,并保持切换位置,直到每个索引"i"不大于"i + 1",然后循环按升序完全排序.

所以我正在看这个冒泡排序代码.以下是来源:www.programmingsimplified.com/c/source-code/c-program-bubble-sort

这是代码:

/* Bubble sort code */

#include <stdio.h>

int main()
{
  int array[100], n, c, d, swap;

  printf("Enter number of elements\n");
  scanf("%d", &n);

  printf("Enter %d integers\n", n);

  for (c = 0; c < n; c++)
    scanf("%d", &array[c]);

  for (c = 0 ; c < ( n - 1 ); c++)
  {
    for (d = 0 ; d < n - c - 1; d++)
    {
      if (array[d] > array[d+1]) /* For decreasing order use < */
      {
        swap       = array[d];
        array[d]   = array[d+1];
        array[d+1] = swap;
      }
    }
  }

  printf("Sorted list in ascending order:\n");

  for ( c = 0 ; c < n ; c++ )
     printf("%d\n", array[c]);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我理解除"d"之外的所有变量.我不知道他们的意思是什么.所以这是令我困惑的代码部分:

 for (c = 0 ; c < ( n - 1 ); c++)
      {
        for (d = 0 ; d < n - c - 1; d++)
        {
          if (array[d] > array[d+1]) /* For decreasing order use < */
          {
            swap       = array[d];
            array[d]   = array[d+1];
            array[d+1] = swap;
          }
        }
      }
Run Code Online (Sandbox Code Playgroud)

据我所知,第一个for循环遍历长度为n-1的数组,因为在C中,数组的第一个索引是0.第二个for循环的长度似乎是"c"的长度,因为它逐步通过数组,但它不是数组的长度(n - 1),所以这让我感到困惑.我不知道d是什么,所以我不明白为什么在交换语句中使用"d"而不是"c.我完全得到交换所做的事情,切换数组的元素,正如我在介绍交换索引.

所以我想我最不理解的是为什么第二个for循环是必要的以及d数组的长度:

 for (d = 0 ; d < n - c - 1; d++)
            {
               // if comparison switch check.
            }
Run Code Online (Sandbox Code Playgroud)

因此,网站中提供的代码可以正确地进行冒泡排序.我尝试了n = 5,值= {9,8,7,6,5}

它成功地按升序将它们重新排列为{5,6,7,8,9}.

由于我不理解第二个for循环,我想我会看到如果我不包含它会发生什么,结果很有趣.我刚刚更改了删除第二个for循环,并用c替换了"d"的提及.

#include <stdio.h>

int main(void)
{

int array[100], n, c, swap;

printf("Enter number of elements\n");
scanf("%d", &n);

// Tell the user to enter integers in a loop.
printf("Enter %d integers\n", n);
    for (c = 0; c < n; c++)
        scanf("%d", &array[c]);

        for(c = 0; c < (n - 1); c++)
        {

                if(array[c] > array[c + 1])
                {
                    swap = array[c];
                    array[c] = array[c+1];
                    array[c+1] = swap;
                }

        }

        printf("Sorted list in ascending order:\n");

        for(c = 0; c < n; c++)
            printf("%d\n", array[c]);

    return (0);
}
Run Code Online (Sandbox Code Playgroud)

如果我在删除第二个for-loop时看到这段代码会发生什么,我会得到这个结果.我输入了5个元素:{9,8,7,6,5},我得到的顺序是:{8,7,6,5,9}.这显然不是正确的升序.但它在整个集合中做了一个泡沫分类; 它只完成了一次传递,所以这就是为什么这个排序的数组从8开始,因为它只进行了一次传递.

同样,这个错误的代码现在实际上可以正确地对这个5元素数组进行排序:{1,8,2,3,7}.它将其更改为{1,2,3,7,8}.但它只需要通过数组一次就能正确完成这个冒泡排序.

所以我发现第二个for循环确保数组按正确的顺序按数字顺序排序,因为需要多次冒泡排序来进行更改.

但我仍然不理解它,很难解释我怎么理解它.我非常清楚"c"是从头到尾滑过数组的索引.但是什么样的索引是"d",它真正从哪里开始,它到底在哪里结束?

谢谢.

如果您碰巧有更简单的代码,不需要for-loop启动泡泡排序,并且您只能使用一个变量,那么我将非常感谢您欣赏该代码.

SHA*_*AIN 9

这里c&d用于遍历和排序循环

对于c ,整个循环遍历n次

为d

除了已排序的数组的所有元素都被遍历和操作以对数组进行排序

希望你现在明白这个事实

快乐的编码


Ant*_*yev 6

当C为0时,我们遍历整个数组(最多为N - C - 1)并且最大数字放在最后.一旦我们拥有它所属阵列末尾的最大数字,那么我们就不用再担心它了.所以在那之后,C递增,我们对N - 1 - 1进行排序,这将是D将达到的最远值.

另一种解释方式.当C为0时,我们将最大数字带到数组中的最后一个位置.当C为1时,我们将第二个最大数字提升到阵列中的最后一个位置.等等等等.

D是实际进行遍历的那个,并将C视为计数器.