LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 588|回复: 3

冒泡排序。怎么可能出错???

[复制链接]
发表于 2004-10-28 09:55:49 | 显示全部楼层 |阅读模式
先看我的代码:

  1. #include <stdio.h>

  2. void main()
  3. {
  4.         int buf[]={20,11,22};
  5.         int i,j,length,exchange,temp;
  6.         length=sizeof(buf)/sizeof(int);
  7.         printf("排序前:");
  8.         for(i=0;i<length;i++)
  9.                 printf("%d\t",buf[i]);
  10.         printf("\n");

  11.         for(i=1;i<length;i++){ //最多做length-1趟排序
  12.     exchange=0;
  13.     for(j=length-1;j>=i;j--) //对当前无序区R[i..n]自下向上扫描
  14.         if(buf[j]<buf[j-1]){
  15.                  temp=buf[j];
  16.                   buf[j]=buf[j-1];
  17.                   buf[j-1]=temp;
  18.                   exchange=1;
  19.         }
  20.                 if(!exchange){ //本趟排序未发生交换,提前终止算法
  21.                         printf("无变化\n");
  22.                         return;
  23.                 }
  24.     }
  25.        
  26.         printf("排序后:");
  27.         for(i=0;i<length;i++)
  28.                 printf("%d\t",buf[i]);
  29.         printf("\n");
  30. }
复制代码

得到的结果为:
排序前:20      11      22
无变化

不知为什么,明明11<22,怎么可能没变化呢???
高手指教。
发表于 2004-10-28 11:30:22 | 显示全部楼层
for(i=1;i<length;i++){ //最多做length-1趟排序
    exchange=0;
该为:
exchange=0;
for(i=1;i<length;i++){ //最多做length-1趟排序
发表于 2004-10-29 00:24:26 | 显示全部楼层
楼上正解
楼主可以跟一下进程看看,你的程序没有错,而且已经排序完成了,但是有一个特殊情况,就是除非最大的数字在最前面,否则你的程序必然打印无变化,因为除非最后一次也变化,否则exchange都会等于0,而最后一次也要交换的情况只出现在最大的数字在最前面的情况下,这个是你的程序的改进,可以让你清楚的看到每一步的变化,你可以试试一些步同的赋值

  1. #include <stdio.h>

  2. void pr(int * buf,int length)
  3. {
  4.         int i;
  5.         for(i=0;i<length;i++)
  6.         {
  7.                 printf("%d\t",buf[i]);
  8.         }
  9.         printf("\n");
  10. }

  11. int main()
  12. {
  13.         int buf[]={10,11,7,6,5,9};
  14.         int i,j,length,exchange,temp;
  15.         length=sizeof(buf)/sizeof(int);
  16.         printf("befor:\n");
  17.         for(i=0;i<length;i++)
  18.                 printf("%d\t",buf[i]);
  19.         printf("\n");       
  20.         for(i=1;i<length;i++)
  21.         {                
  22.                     for(j=length-1;j>=i;j--)
  23.                 {
  24.                         exchange=0;
  25.                         if(buf[j]<buf[j-1])
  26.                         {
  27.                                  temp=buf[j];
  28.                                   buf[j]=buf[j-1];
  29.                                   buf[j-1]=temp;
  30.                                   exchange=1;
  31.                         }
  32.                         printf("\nexchange is %d\n",exchange);
  33.                         pr(buf,length);
  34.                 }
  35.                 if(!exchange)
  36.                 {
  37.                         printf("no change\n");
  38.                         return;
  39.                 }
  40.             }               
  41.         printf("after:\n");
  42.         pr(buf,length);       
  43. }

复制代码
发表于 2004-10-29 13:00:12 | 显示全部楼层
把return改为break.
排到最后exchange肯定是0.所以应该结束循环,而不是退出整个程序。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表