【问题标题】:In this bubble sort code what do these variables c & d mean in C?在这个冒泡排序代码中,这些变量 c 和 d 在 C 中是什么意思?
【发布时间】:2017-09-30 18:24:14
【问题描述】:

所以我知道升序冒泡排序检查索引 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;
}

我了解除“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;
          }
        }
      }

据我了解,第一个 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.
            }

所以网站中提供的代码正确地进行了冒泡排序。 我用 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);
}

如果我在删除第二个 for 循环时看到这段代码发生了什么,我会得到这个结果。我输入了 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 循环开始,并且您只能使用一个变量,那么我将不胜感激欣赏该代码。

【问题讨论】:

  • 或许this visualisation会帮助你理解
  • 最好的办法是在代码中添加printfs 以显示cd 的值。并且绝对将printf 添加到您修改过的代码中。您可能会惊讶地看到 c 在该代码中所做的事情。
  • 哇!这个可视化是天使!一个动画视频值一千张照片。非常感谢!
  • 这是个好建议!
  • 您不需要两个带有索引的 for 循环。 en.wikipedia.org/wiki/Bubble_sort#Pseudocode_implementation 显示了一个 while 循环和一个 for 循环,因此它只会使用一个索引变量。

标签: c arrays sorting


【解决方案1】:

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

为 c 整个循环遍历n次

为d

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

希望你现在明白这个事实

快乐编码

【讨论】:

  • 谢谢!既然你向我解释了“d”的真实长度,我的头疼得少了很多。非常感谢!
  • @xyz123 虽然你的疑问很清楚,但是你可以通过使用一个布尔变量来优化你的冒泡排序算法。请参阅我的blog 了解更多详情。对于最佳情况,这将降低 O(n) 的时间复杂度。目前,无论您提供什么输入,您的算法都将在 O(n^2) 中运行。
  • 嗯,您以某种方式降低了计算复杂度,但是您修改后的函数定义仍然具有类似的 for --> for --> if 结构。
【解决方案2】:

当 C 为 0 时,我们会遍历整个数组(最多 N - C - 1)并将最大数字放在最后。一旦我们在它所属的数组的末尾有了最大的数字,那么我们就不需要再担心它了。因此,在那之后,C 递增,我们将 N - 1 - 1 排序,这将是 D 将达到的最远值。

另一种解释方式。当 C 为 0 时,我们将最大数字带到数组中的最后一个位置。当 C 为 1 时,我们将第 2 个最大数字提升到数组中的最后 - 1 位置。以此类推。

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

【讨论】:

  • 对我来说真的很有意义!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多