为什么要为循环打印/对所有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;
}
}
}
结果正确,并返回正确的排序整数数组
答案 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中,以此类推。
希望这很有帮助。