自学《C程序设计》刚学到数组,在书中有一道例题:
用冒泡法对10个数进行比较(由大到小)
前面的讲解中说:“如果有N个数,要进行N-1趟比较,在第1趟比较中要进行N-1次两两比较,在第J趟比较中要进行N-J次两两比较”
自己画了几次图以后大概明白了这个方法,但是看到后面给出的程序以后脑袋全乱了……
程序如下:
#include <stdio.h>
void main()
{
int a[10];
int i, j, t;
printf("input 10 numbers:\n");
for (i=0; i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=0;j<9;j++) /* 这里还大概能想清楚,0是第一趟,9是第十趟*/
for(i=0; i<9-j;i++) /* 到这里就乱了,一共应该是有十个数,前面说了,在第J趟比较中要进行N-J次两两比较,此处N应该为10,为什么这里写的是9呢?N代表有多少个数,而不是第几趟呀,脑袋乱乱的,越想越乱…… */
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
printf("the sorted numbers:\n");
for(i=0;i<10;i++)
printf("%d",a[i]);
printf("\n")
}
----------------解决方案--------------------------------------------------------
for(i=0; i<9-j;i++) /* 到这里就乱了,一共应该是有十个数,前面说了,在第J趟比较中要进行N-J次两两比较,此处N应该为10,为什么这里写的是9呢?N代表有多少个数,而不是第几趟呀,脑袋乱乱的,越想越乱…… */
因为i=0开始的啊!
自学!错了勿怪!
我是这样想的
----------------解决方案--------------------------------------------------------
你把具体的数字代入进去,自己再看看应该比较几趟.
----------------解决方案--------------------------------------------------------
把程序写出来~自己调试吧~应该学会用编译工具调试
象这些简单的东西边调试边理解就搞得定的~
----------------解决方案--------------------------------------------------------
那个是个二维循环
for(j=0;j<9;j++) /* 一重循环*/
for(i=0; i<9-j;i++) /*二重循环,且每次循环都到9-j结束*/
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
----------------解决方案--------------------------------------------------------
这种东西都是得自己去钻啊
----------------解决方案--------------------------------------------------------
for(j=0;j<9;j++)
for(i=0; i<9-j;i++)
外层j=0时,里层0<=i<=8之间,但是比较的是 a[i]>a[i+1]
如果里层循环写成i=0;i<9;i++ 的话,楼主应该明白吧?
正因为是冒泡,所以 沉底的东西 就不去再考虑它了
因此 只要在 i<9 里面添一个 变量,使得 i<(*) *这里应该是一个递减的
所以 有了 外层循环
----------------解决方案--------------------------------------------------------
后面是a[i]>a[i+1]!!!!!!!!!!!!!!!!!!!!!!!!!!!
----------------解决方案--------------------------------------------------------
还是不懂啊
能不能再详细点?
----------------解决方案--------------------------------------------------------
//楼主朋友,如果这样"冒泡"是否好理解些?
#include<stdio.h>
#define N 10
int main( )
{ int a[N]={1,4,5,8,7,3,2,0,9,6};//N个任意整数
int i,j;
for(i=1;i<=N-1;i++)//第i轮,i=1,2,3,...,N-1
for(j=1;j<=N-i;j++)//第j次,j=1,2,3,...,N-i
if(a[j-1]>a[j])//此处是按升序排列
{int t=a[j-1];a[j-1]=a[j];a[j]=t;}
//至此,排序其实已经完成。俺来看看效果吧:
for(i=0;i<N;i++)printf("%i ",a[i]);
printf("\n");
return 0;
}
----------------解决方案--------------------------------------------------------