因此,我了解到,升序气泡排序会检查索引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。数组,但不是数组的长度(n-1),这让我感到困惑。我不知道d是什么,所以我不明白为什么在swap语句中使用“d”而不是“c”。我完全了解了swap的作用,如我在解释中切换了数组的元素介绍交换索引。

所以我想我最不明白的是为什么第二个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循环,将会发生什么,结果很有趣。我刚刚更改,删除了第二个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循环起始代码的简单代码,并且只能使用一个变量,那么我很欣赏这些代码。

最佳答案

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

(用于C )
整个循环遍历了n次

代表d

遍历数组中除排序的之外的所有其他元素,并对其进行操作以对数组进行排序

希望你现在了解事实

快乐编码

09-25 16:26
查看更多