【问题标题】:Confused about by this nested for loop对这个嵌套的 for 循环感到困惑
【发布时间】:2019-06-20 22:46:26
【问题描述】:

为什么这个 for 循环打印/排序所有 10 个整数。 它以大于或等于 0 的 i = N - 1 开始,因此它继续进行下一个 for 循环。这里 J 是 1 小于或等于 i 所以它编译。

我遇到的问题是第一次迭代是 i = 9 和 j = 1, 8和2, 7和3, 6和4, 5和5 最后是 4 和 6(停止点),

其中 j 不小于或等于 i。它不应该只编译它运行的 5 次而不是它的 10 次。

#include <stdio.h>

int arr[10] = { 3,6,1,2,3,8,4,1,7,2};

void bubble(int a[], int N);

int main(void)
{
    int i;
    putchar('\n');
    for (i = 0; i < 10; i++)
    {
        printf("%d ", arr[i]);
    }
    bubble(arr,10);
    putchar('\n');

    for (i = 0; i < 10; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

void bubble(int a[], int N)
{
    int i, j, t;
    for (i = N-1; i >= 0; i--)
    {
        for (j = 1; j <= i; j++)
        {
            if (a[j-1] > a[j])
            {
                t = a[j-1];
                a[j-1] = a[j];
                a[j] = t;
            }
        }
    }
}

我没有想到的具体代码是

for (i = N-1; i >= 0; i--)
{
    for (j = 1; j <= i; j++)
    {
        if (a[j-1] > a[j])
        {
            t = a[j-1];
            a[j-1] = a[j];
            a[j] = t;
        }
    }
}

结果正确并返回正确的排序整数数组

【问题讨论】:

  • j 总是从 1 开始。
  • 您可以尝试在 for 循环中使用 printf 语句,并在每次迭代中遍历 i 和 j 的内容,以了解逻辑是如何执行的。在您的情况下,无论 i 是什么,j 从 1 开始,并将从 1 执行到 i。
  • 将“冒泡排序”打入您最喜欢的搜索引擎,以便您了解算法。然后试着理解代码。
  • 每次外部迭代都将当前范围内最大的元素移动到末尾。

标签: c for-loop pointers bubble-sort


【解决方案1】:

这 2 个循环是嵌套的。行为是对于外部循环的每次迭代,完整的内部循环都会运行。这意味着对于一个固定的 i,j 取值从 1 到 i:

i = 9, j = 1;
i = 9, j = 2;
i = 9, j = 3;
...
i = 9, j = 9;

现在执行在内部循环结束并返回到外部,递减 i。

i = 8, j = 1;
i = 8, j = 2;
...
i = 8, j = 8;

i = 7, j = 1;
...
i = 7, j = 7

i = 6, j = 1
...
i = 6, j = 6

这样一直持续到 i = 1, j = 1。 关于冒泡排序,我认为您可以在网上找到一些不错的可视化,例如 https://www.youtube.com/watch?v=67k3I2GxTH8

【讨论】:

    【解决方案2】:

    在代码中, 您会看到内部循环的迭代次数总是比以前少一次。

    这是因为在冒泡排序中,在每次迭代结束时,第 0 到第 (N - i) 个数组中的最大元素 (其中 N = 数组的大小,i 是迭代次数,考虑到它从 1 到 N 不等)被放到它的实际位置

    我们以数组 A = {2, 5, 6, 1, 9, 8} 为例

    第一次迭代后 A = {2, 5, 1, 6, 8, 9}

    第二次迭代后 A = {2, 1, 5, 6, 8, 9}

    第三次迭代后 A = {1, 2, 5, 6, 8, 9}

    第 4 次迭代后 A = {1, 2, 5, 6, 8, 9}

    第 5 次迭代后 A = {1, 2, 5, 6, 8, 9}

    如您所见,在第 1 次迭代之后,最高元素 9 位于其正确位置 同样在第 2 次迭代中为 8,在第 3 次迭代中为 6,依此类推。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-09-08
      • 2017-05-10
      • 2016-07-13
      • 2017-05-03
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      相关资源
      最近更新 更多