关于冒泡 排序 的一些 问题#include stdio.h#include stdafx.hint main(){int a[10]int i,j,tputs(
关于 冒泡 排序 的一些 问题
#include <stdio.h>
#include <stdafx.h>
int main()
{
int a[10];
int i,j,t;
puts("input 10 numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=0;j<9;j++) //这个循环演算了很多次还是不太理解,比喻说我上面输入了10个数组的值,分别是,9,8,7,6,5,4,3,2,1,0,这个外循环的第一次循环是不是这样排序的9,8,7,6,5,4,3,2,1,0
for(i=0;i<9-j;i++)//然后内循环这里再进行一个数字的比较,把大的数字放到后面去,8,7,6,5,4,3,2,1,0,9变成这样? 9-j 是不是把最大数放后面不再循环了。
if(a[i]>a[i+1])// 相邻元素进行比较
{
t=a[i]; //第一个元素 先存放到T变量
a[i]=a[i+1];//再把第二个元素交到 第一元素a[i]的位置
a[i+1]=t; // 把第一个元素 放到第二个元素的位置
}
printf("the sorted numbers:\n");
for(i=0;i<10;i++)
printf("%5d",a[i]);
printf("\n");
return 0;
}
现在我的主要问题,就是卡在了循环这里。不明白 他循环所产生的数据变化
[解决办法]9,8,7,6,5,4,3,2,1,0
大循环从0-9
假设大循环是0
小循环从1开始,第一次,9比8大,换个位子就成了
8,9,7,6,5,4,3,2,1,0,
第二次8比7大在换位置
7,9,8,6,5,4,3,2,1,0,
换到最后
0,9,8,7,6,5,4,3,2,1
然后在处理0后面那个一个串9,8,7,6,5,4,3,2,1
同样的方法。
[解决办法]每进行一次内循环(i),就将一个当前循环范围的最大的值移到了后边,而且循环的范围缩小一个,因为已经找到大的了,所以不用再往后检查了(i<9-j)
[解决办法]搜“排序动画演示”
[解决办法]9,8,7,6,5,4,3,2,1,0
大循环从0-9
假设大循环是0
小循环从0开始,第一次i=0 a[0]跟a[1]比较,9比8大,换个位置就成了
8,9,7,6,5,4,3,2,1,0,
第二次i=1 a[1]跟a[2]比较 9比7大再换位置
8,7,9,6,5,4,3,2,1,0,
换到最后一轮,就把最大的数9放到了最后
8,7,6,5,4,3,2,1,0,9
然后大循环j = 1的时候,又把8放到了倒数第二位,因为for循环里面i = N - j,所以8不跟最后的9比较
同样的方法,如此类推。
[解决办法]在那个双重循环中,内层循环第一次执行,10个数比较九次将最大的移到最右边,现在最大的数已经移完,就进行移第二大的数,剩余9个数比较8次就能将第二大的数移到9的左边,然后第大三,第四大,一直到第九大(也就是最小的),一共进行九次,而外层循环的作用就是执行这九次内层循环