对此嵌套的for循环感到困惑

时间:2019-06-20 22:46:26

标签: c for-loop pointers bubble-sort

为什么要为循环打印/对所有10个整数排序。 它以i = N-1(大于或等于0)开始,因此继续进行下一个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;
        }
    }
}

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

2 个答案:

答案 0 :(得分:1)

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

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

现在,执行在内部循环中完成,并返回到外部,使i减1。

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

答案 1 :(得分:0)

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

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

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

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

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

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

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

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

如您所见,第一次迭代后,9-最高元素位于其正确位置 与此类似,在第二次迭代8中,是,在第三次迭代6中,以此类推。

希望这很有帮助。

相关问题