注册 登录
编程论坛 C++教室

我写改进型冒泡大家过来看一看,大家给一点建意

点线面 发布于 2011-01-06 21:37, 695 次点击
程序代码:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>

using namespace std;

int main()

 {
     srand((time(0)));
      
     const int M = 20;
     int i,j,a[20],temp,m;
     bool Bool;

     for(i=0;i<M;a[i]=rand()%100+1,i++);

                 for(i=0;i<M;i++)
                cout<<a[i]<<" ";
                cout<<'\n';

       i=0;
     do{
           Bool = false;

        for(j=i;j<M-1-i;j++)
            if(a[j] > a[j+1])
            {

                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
                Bool = true;
            }
         
        if(Bool == true)
        {
            Bool = false;

            for(m = M-2-i ; m > i; m --)
               if( a[m] < a[m-1] )
            {
                temp = a[m];
                a[m] = a[m-1];
                a[m-1] = temp;
                Bool = true;
            }
        }
            i++;

     }while(Bool);
            for(i=0;i<M;i++)
                cout<<a[i]<<" ";
           
     getch();
     return 0;
}
有什么建意可以提出来

[ 本帖最后由 点线面 于 2011-1-7 09:56 编辑 ]
6 回复
#2
点线面2011-01-07 10:45
程序代码:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>

using namespace std;

int main()

 {
     srand((time(0)));
      
     const int M = 20;
     int i,j,a[M],m;
     bool Bool;

     for(i=0;i<M;a[i]=rand()%100+1,i++);    //生成M个随机数

                 for(i=0;i<M;i++)            //打印M个数据
                cout<<a[i]<<" ";
                cout<<'\n';

       i=0;
     do{
           Bool = false;

        for(j=i;j<M-1-i;j++)                 //将最大放在右边,适当收窄范围
            if(a[j] > a[j+1])
            {
                a[j] = a[j]+a[j+1];          //两个数交换,另一种方法
                a[j+1] = a[j]-a[j+1];
                a[j] = a[j]-a[j+1];
                Bool = true;
            }
         
        if(Bool == true)                      //如果没有排序,就结束任务     
        {
            Bool = false;

            for(m = M-2-i ; m > i; m --)      //将最小放在左边,适当收窄范围
               if( a[m] < a[m-1] )
            {
                a[m] = a[m]^a[m-1];           //两个数交换,另一种方法
                a[m-1] = a[m]^a[m-1];
                a[m] = a[m]^a[m-1];
                Bool = true;
            }
        }
            i++;

     }while(Bool);                             //如果没有排序,就结束任务

            for(i=0;i<M;i++)                   //打印排好的M个数据
                cout<<a[i]<<" ";
           
     getch();
     return 0;
}
作了小小的修改,顺便加注释
#3
点线面2011-01-07 11:48
程序代码:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>

using namespace std;

int main()

 {
     srand((time(0)));
      
     const int M = 20;
     int i,j,a[M];
     bool Bool=true;

     for(i=0;i<M;a[i]=rand()%100+1,i++);    //生成M个随机数

                 for(i=0;i<M;i++)            //打印M个数据
                cout<<a[i]<<" ";
                cout<<'\n';

     for(i=0;Bool&&i<M-1;i++)               //如果没有排序结束任务        
     {
            Bool = false;                    

        for(j=0;j<M-1-i;j++)               
            if(a[j] > a[j+1])
            {
                a[j] = a[j]^a[j+1];         
                a[j+1] = a[j]^a[j+1];
                a[j] = a[j]^a[j+1];

                Bool = true;
            }
         
     }
            for(i=0;i<M;i++)                   //打印排好的M个数据
                cout<<a[i]<<" ";
           
     getch();
     return 0;
}
同上面的程序算法没有明显差别,差别在于上面的程序多了存储空间,综合考虑还是这个程序适合改进型

[ 本帖最后由 点线面 于 2011-1-7 11:54 编辑 ]
#4
yangglemu2011-01-08 11:02
好,不错
看冒泡排序有两层循环就行了,剩下的就不用看了,他们说的
#5
xdzsm2011-01-10 22:23
好!学习了!
#6
DestinyLord2011-01-16 11:26
好像就是把算法改了吧?感觉改复杂了一样.....
#7
BlueGuy2011-01-16 11:35
原本只要简单的一个标志位就行了, 代码改成这个样子,
说明楼主基础不好,同时也说明楼主思想不纯。
1