c的小问题。兄弟们帮帮忙哈。

时间:2021-03-17 17:32:55
用改进的冒泡法对数组a[n]从小到大排序。
选择题
void bubble(int a[],int n)
{
 int j,k,jmax,temp;
jmax=(__1__);
do
  { k=(__2__);
    for(j=0;j<jmax;j++)
 if(a[j]>a[j+1])
   {temp=a[j];
    a[j]=a[j+1];
    a[j+1]=temp;
    k=(___3_);
   jmax=(_4__);
  }while(jmax>0);
}
1  a n b n-1 c 0 d n+1
2  a n b n-1 c 0 d n+1
3  a n b j   c 0 d jmax
4  a n b j   c k d 0

17 个解决方案

#1


兄弟们。不要光说答案。要解释一下嘛

#2


我刚好在学C你讲一下好吗?

#3


这是什么人出的题目?什么人写的代码?

#4


1 b,4 b;2、3两行可以不要,也就是k可以不用,没什么用处。这种写法就是减少了一个循环嵌套,用jmax=j来限制循环次数,使其依次减少。第一个jmax=n-1是因为j+1最后应等于jmax-1。

#5


以前教过,现在忘了

#6


to liao2001(知之为知之,不知为不知。。。) 
这是四川省2级考试题。

to killer1984(天行贱)
这是四川省2级考试题。我想不会出现什么不用的情况吧

#7


to killer1984(天行贱)
按你说的2,3不用。n是正数。n-1是正数,jmax=n-1后jmax也是正数。(j=0;j<jmax;j++).j第1次就成了0,又符给jmax。循环就完了。还怎么排序。就算不完也是死循环啊。

#8


不会的,for循环到if语句结束时结束,(if的'}'应该在3那句前面吧,你打掉了),而每次fot循环后,j的值都等于jmax-1,这时才执行jmax=j,即jmax每次只减一,到最后jmax=1时,for循环后j=0,这时jmax=j,jmax就为0,结束do while循环.

#9


对不起哈。打掉个‘}’。我翻了翻书。是在第四句处。不在第3句处。

#10


有了‘}’后。我觉得按你的意思就应该选b b b b。是不是啊?

#11


在第4句处的话(指在jmax=(4)一句前),意思就变了,那样每次for循环都会有条件地执行k=(3)一句,即由上一次发生换位的次数来决定下次的for循环次数,k就有用了,用来标注发生换位的位置.答案就是b b b c

#12


gzz

#13


你的题目一定有问题.首先,1,2两个答案是一样的.
而且k在这里也看不出来有什么用处.我将你的程序改了一下,是正确的.
你在看看原来的题目,有没有抄错.
void bubble(int a[],int n)
{
 int j,k,jmax,temp;
jmax=n;
do
  { /*k=();      */
    for(j=0;j<jmax;j++)
 if(a[j]>a[j+1])
   {temp=a[j];
    a[j]=a[j+1];
    a[j+1]=temp;}                    /*你说少的括号是加在这里吗?*/
/*    k=();            */
   jmax=jmax-1;
  }while(jmax>0);
}

main()
{ int a[10]={3,5,2,1,7,6,9,8,0,4};
  int i;
  bubble(a,10);
  for(i=0;i<10;i++)
    printf("%d",a[i]);
  }

#14


如果一定要让k有用的话,那么它只能判断在上一趟比较中是否有元素交换,如果没有就终止循环。但是在这个程序中体现不出这个意图。

#15


to chengdulang:
对不起,上面说的有问题.因为把答案的方式看错了,而且没有注意题目说"是改进的bubble".
现在将我的程序给你贴上来,
void bubble(int a[],int n)
{
 int j,k,jmax,temp;
jmax=n;
do
  { k=0;
    for(j=0;j<jmax;j++)
 if(a[j]>a[j+1])
   {temp=a[j];
    a[j]=a[j+1];
    a[j+1]=temp;
    k=j; }
   jmax=k;
  }while(jmax>0);
}
现给你解释一下这个程序,这个程序的好处是对于基本有序的数来排序的次数会明显减少.
如数列,0,1,2,3,5,4,6,7,8,9
在一趟排序之后,k记下了最后一个交换的位置,k=4;
那么也就是说4之后的数列已经有序,我们下次就不用对他们排序了,所以jmax=k;
在第二趟,k=0,现在对0-4之间的元素排序,在这之间没有元素交换,所以k=0,jmax==k==0
循环结束.

对于上面错误的回答,再次表示歉意.还有问题回贴.

#16


to zalyer(小照)
很感谢你的回答。你的细致认真,真是很值得我学习。
我运行了你的程序。得到了正确的答案。但是killer1984(天行贱)说的我运行也是对的。我想了很久也没想明白。考试题不会出两个答案都对的题吧?

#17


to zalyer(小照)
你的意思我都明白。谢谢。

to killer1984(天行贱)
你的程序不对。用1到9和11排序得不到答案。

#1


兄弟们。不要光说答案。要解释一下嘛

#2


我刚好在学C你讲一下好吗?

#3


这是什么人出的题目?什么人写的代码?

#4


1 b,4 b;2、3两行可以不要,也就是k可以不用,没什么用处。这种写法就是减少了一个循环嵌套,用jmax=j来限制循环次数,使其依次减少。第一个jmax=n-1是因为j+1最后应等于jmax-1。

#5


以前教过,现在忘了

#6


to liao2001(知之为知之,不知为不知。。。) 
这是四川省2级考试题。

to killer1984(天行贱)
这是四川省2级考试题。我想不会出现什么不用的情况吧

#7


to killer1984(天行贱)
按你说的2,3不用。n是正数。n-1是正数,jmax=n-1后jmax也是正数。(j=0;j<jmax;j++).j第1次就成了0,又符给jmax。循环就完了。还怎么排序。就算不完也是死循环啊。

#8


不会的,for循环到if语句结束时结束,(if的'}'应该在3那句前面吧,你打掉了),而每次fot循环后,j的值都等于jmax-1,这时才执行jmax=j,即jmax每次只减一,到最后jmax=1时,for循环后j=0,这时jmax=j,jmax就为0,结束do while循环.

#9


对不起哈。打掉个‘}’。我翻了翻书。是在第四句处。不在第3句处。

#10


有了‘}’后。我觉得按你的意思就应该选b b b b。是不是啊?

#11


在第4句处的话(指在jmax=(4)一句前),意思就变了,那样每次for循环都会有条件地执行k=(3)一句,即由上一次发生换位的次数来决定下次的for循环次数,k就有用了,用来标注发生换位的位置.答案就是b b b c

#12


gzz

#13


你的题目一定有问题.首先,1,2两个答案是一样的.
而且k在这里也看不出来有什么用处.我将你的程序改了一下,是正确的.
你在看看原来的题目,有没有抄错.
void bubble(int a[],int n)
{
 int j,k,jmax,temp;
jmax=n;
do
  { /*k=();      */
    for(j=0;j<jmax;j++)
 if(a[j]>a[j+1])
   {temp=a[j];
    a[j]=a[j+1];
    a[j+1]=temp;}                    /*你说少的括号是加在这里吗?*/
/*    k=();            */
   jmax=jmax-1;
  }while(jmax>0);
}

main()
{ int a[10]={3,5,2,1,7,6,9,8,0,4};
  int i;
  bubble(a,10);
  for(i=0;i<10;i++)
    printf("%d",a[i]);
  }

#14


如果一定要让k有用的话,那么它只能判断在上一趟比较中是否有元素交换,如果没有就终止循环。但是在这个程序中体现不出这个意图。

#15


to chengdulang:
对不起,上面说的有问题.因为把答案的方式看错了,而且没有注意题目说"是改进的bubble".
现在将我的程序给你贴上来,
void bubble(int a[],int n)
{
 int j,k,jmax,temp;
jmax=n;
do
  { k=0;
    for(j=0;j<jmax;j++)
 if(a[j]>a[j+1])
   {temp=a[j];
    a[j]=a[j+1];
    a[j+1]=temp;
    k=j; }
   jmax=k;
  }while(jmax>0);
}
现给你解释一下这个程序,这个程序的好处是对于基本有序的数来排序的次数会明显减少.
如数列,0,1,2,3,5,4,6,7,8,9
在一趟排序之后,k记下了最后一个交换的位置,k=4;
那么也就是说4之后的数列已经有序,我们下次就不用对他们排序了,所以jmax=k;
在第二趟,k=0,现在对0-4之间的元素排序,在这之间没有元素交换,所以k=0,jmax==k==0
循环结束.

对于上面错误的回答,再次表示歉意.还有问题回贴.

#16


to zalyer(小照)
很感谢你的回答。你的细致认真,真是很值得我学习。
我运行了你的程序。得到了正确的答案。但是killer1984(天行贱)说的我运行也是对的。我想了很久也没想明白。考试题不会出两个答案都对的题吧?

#17


to zalyer(小照)
你的意思我都明白。谢谢。

to killer1984(天行贱)
你的程序不对。用1到9和11排序得不到答案。