当前位置: 代码迷 >> C语言 >> 菜鸟关于冒泡法的疑问!
  详细解决方案

菜鸟关于冒泡法的疑问!

热度:282   发布时间:2006-04-29 14:50:00.0
菜鸟关于冒泡法的疑问!

自学《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")

}

搜索更多相关的解决方案: 疑问  冒泡  int  void  

----------------解决方案--------------------------------------------------------
以下是引用aaaisan在2006-4-29 14:50:00的发言:

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;
}
----------------解决方案--------------------------------------------------------
  相关解决方案