回 帖 发 新 帖 刷新版面

主题:关于冒泡排序的 一些改进算法

拜托大家帮帮忙,关于冒泡排序算法的改进算法,双向冒泡排序,标志变量法排序,双冒泡排序,这三种算法的实例~~~~本人不太懂。。。[em11]  希望哪位高手帮帮忙~~

回复列表 (共6个回复)

沙发

你搜一下,我有发过这样 的贴!

板凳

baidu上还是有的,你可以先找代码,然后找人给你讲,实在看不懂可以发帖说明你看不懂哪一段。
不要说整个程序都看不懂,那样你的动机会被怀疑的

3 楼

我三年前写的,你参考一下!

#include <iostream>
#include <stdlib.h>
#include <cstring>
#include <string.h>
using namespace std;

int main()
{
    int i=0,j=0,k=0,a=0,b=0,n=0,m=0,sum=0,array1[256]={0,0},up=0,down=0;
    char message[10]="Y",mode='o';
    cout<<"这是一个升序/降序排序法;输入一组整数进行升序/降序排序,并输出!\n";
    while(1)
    {
        cout<<"请输入一个整数!指定要输入数组的大小!\n";
        cin>>n;
        cout<<"请输入一组整数!小于65535的整数\n";
        for(i=0;i<n;i++)
        {
            cin>>array1[i];
        }
        for(i=0;i<n;i++)
        {
            cout<<"   "<<array1[i];
        }
        cout<<'\n';
        cout<<'\n';
        cout<<"请输入'u',为升序排列,请输入'd',为降序排序"<<'\n';
        cin>>mode;
        switch(mode)
        {
        case 'u': sum=1;
            break;
        case 'd': sum=2;
            break;
        default: cout<<" endd"<<mode<<endl;
        }
        cout<<"sum="<<sum<<"   n="<<n<<'\n';
        if(sum==2)
        {
        for(i=0;i<n;i++)
        {
        for(j=n-1;j>i;j--)
        {
        if(array1[j]>array1[j-1])
        {
            down=array1[j-1];
            array1[j-1]=array1[j];
            array1[j]=down;
        }
        }
        for(m=0;m<n;m++)
        {  
            cout<<"   "<<array1[m];
        }
            cout<<'\n';
        }
        }
        if(sum==1)
        {
        for(a=0;a<n;a++)
        {
        for(b=n-1;b>a;b--)
        {
        if(array1[b]<array1[b-1])
        {
            up=array1[b];
            array1[b]=array1[b-1];
            array1[b-1]=up;
        }
        }
        for(m=0;m<n;m++)
        {  
            cout<<"   "<<array1[m];
        }
            cout<<'\n';
        }
        }
        cout<<endl<<endl<<endl;
        if(n>0)
        {
        for(i=0;i<8;i++)
            cout<<"     "<<array1[i]; 
        }
        cout<<'\n';
        if(n>8)
        {
            for(i=1;i<n/8;i++)
            {
                for(j=0;j<8;j++)
                {
                    cout<<"   "<<array1[8*i+j];
                }
                cout<<'\n';
            }
        }
        if(n>8 && n%8!=0)
        {
            if(n>16)
            {
                for(m=1;m<=n%8;m++)
                    cout<<"   "<<array1[8*i+j+m];
            }
            else if(n<=16 && n>8)
            {    for(m=0;m<n%8;m++)
            cout<<"   "<<array1[8+m];
            }
        }
        cout<<'\n';
        cout<<"是否继续?  Y/N!"<<'\n';
        cin>>message;
        if(!strcmp(message,"n") || !strcmp(message,"N"))
        {
            break;
        }
        for(k=0;k<256;k++)
        {array1[k]=0;
        }
    }
    cout<<endl;
    system("pause");
    return 0;
}

4 楼

ls程序尚待改进之处:
对n缺少入参检验……
大量混用了c风格和c++风格换行……
sum作为一个中间变量进行了无意义的输出
定义了过多的循环变量,C++风格可以利用循环内有效地变量声明方式来减少变量声明数

最后,这个程序只是一个普通的冒泡……不符合lz的需求……
挑毛病完毕,并且表扬ls的分享精神

5 楼

呵呵,是的这样的排序程序显然不符合C++ 编写习惯!这是我初学C++ 时写的,仅供参考!不精,无用的代码太多,优化一下可能要减少1半的代码量,但基本原理是相通的!做参考还是可以的!

6 楼


谢谢~~~虽然 我的问题已经解决了~ 还是非常感谢~[em11]

我来回复

您尚未登录,请登录后再回复。点此登录或注册