zoukankan      html  css  js  c++  java
  • 各种排序

    //

    //  main.cpp

    //  gezhongpaixu_c++

    //

    //  Created by duanqibo on 2019/7/12.

    //  Copyright © 2019年 duanqibo. All rights reserved.

    //  快速排序、直接选择排序、直接插入排序、冒泡排序

    #include <iostream>

    #include <string>

    #include <fstream>

    using namespace std;

    class Grade

    {

    private:

        int ID;

        char Name[20];

        int Math;

        int Chinese;

        int Computer;

        int Total;

    public:

        Grade();

        void setGrade(int id,char *name,int math,int chinese,int computer)

        {

            ID=id;

            strcpy(Name,name);

            Math=math;

            Chinese=chinese;

            Computer=computer;

            Total=Math+Chinese+Computer;

        }

        

        int getID()

        {

            return ID;

        }

        

        string getName()

        {

            return Name;

        }

        

        int getMath()

        {

            return Math;

        }

        

        int getChinese()

        {

            return Chinese;

        }

        

        int getComputer()

        {

            return Computer;

        }

        

        int getTotal()

        {

            return Total;

        }

        

        void show();

    };

    //初始化私有变量

    Grade::Grade()

    {

        ID=0;

        strcpy(Name,"学生姓名");

        Math=0;

        Chinese=0;

        Computer=0;

        Total=0;

    }

    void Grade::show()

    {

        cout<<ID<<' ';

        cout<<Name<<' ';

        cout<<Math<<' ';

        cout<<Chinese<<' ';

        cout<<Computer<<' ';

        cout<<Total<<' ';

        cout<<endl;

    }

    //按语文成绩---快速排序

    int quickpartition(Grade r[],int low,int high)

    {

        //对顺序表r中的语文序列r[low]到r[high]进行快速排序

        

        Grade w;

        w=r[low];

        while(low<high)

        {

            //low和high没有碰面则反复运行

            while((r[high].getChinese()>r[0].getChinese()) && (low<high))

            {

                high--;

            }

            

            r[low]=r[high];

            

            while((r[low].getChinese()<=r[0].getChinese()) && (low<high))

            {

                low++;

            }

            r[high]=r[low];

        }

        r[low]=w;

        return low;

    }

    //按语文成绩快速排序

    void chinese_sort(Grade stu[],int low,int high)

    {

        if(low<high)

        {

            int temp=quickpartition(stu,low,high);

            chinese_sort(stu,low,temp-1);

            chinese_sort(stu,temp+1,high);

        }

    }

    //按计算机成绩--直接插入排序

    void computer_sort(Grade stu[],int n)

    {

        cout<<"按计算机成绩从小到大排序"<<endl;

        int i,j;

        Grade temp;

        for(i=1;i<=n;i++)

        {

            temp=stu[i];

            j=i-1;

            while(temp.getComputer()<stu[j].getComputer())

            {

                stu[j+1]=stu[j];

                j--;

            }

            stu[j+1]=temp;

        }

    }

    //按总分--冒泡排序

    void total_sort(Grade stu[],int n)

    {

        cout<<"按总分由小到大排序:"<<endl;

        for(int i=0;i<n;i++)

        {

            for(int j=0;j<n-i-1;j++)

            {

                if(stu[j].getTotal()<stu[j+1].getTotal())

                {

                    Grade temp;

                    temp=stu[j];

                    stu[j]=stu[j+1];

                    stu[j+1]=temp;

                }

            }

        }

    }

    //按数学成绩--直接选择排序

    void math_sort(Grade stu[],int n)

    {

        cout<<"按数学成绩由小到大排序:"<<endl;

        int i=0,j=0,min=0;

        Grade tmp;

        for(i=0;i<n-1;i++)

        {

            min=i;

            for(j=i;j<n;j++)

            {

                if(stu[min].getMath()>stu[j].getMath())

                {

                    min=j;

                }

            }

            if(min!=i)

            {

                tmp=stu[min];

                stu[min]=stu[i];

                stu[i]=tmp;

            }

        }

    }

    void menu()

    {

        cout<<"**************************"<<endl;

        cout<<"     1.请输入5个学生"<<endl;

        cout<<"     2.按总分排序"<<endl;

        cout<<"     3.按数学成绩排序"<<endl;

        cout<<"     4.按语文成绩排序"<<endl;

        cout<<"     5.按计算机成绩排序"<<endl;

        cout<<"     6.单科成绩均大于85分的学生"<<endl;

        cout<<"     7.将结果输出至文本文件"<<endl;

        cout<<"     0.退出系统"<<endl;

        cout<<"**************************"<<endl;

    }

    void _exit()

    {

        cout<<"**************************"<<endl;

        cout<<"     欢迎使用本系统"<<endl;

        cout<<endl;

        cout<<"           再见!"<<endl;

        cout<<"**************************"<<endl;

    }

    void table()

    {

        cout<<"显示学生情况:"<<endl;

        cout<<"学号"<<' ';

        cout<<"姓名"<<' ';

        cout<<"数学"<<' ';

        cout<<"语文"<<' ';

        cout<<"计算机"<<' ';

        cout<<"总分"<<' ';

        cout<<endl;

    }

    //主函数

    int main()

    {

        const int N=5;

        int i,id,num;

        char name[20];

        int math,chinese,computer;

        Grade student[N];

        ofstream ff;

        ff.open("c:\stu_file.txt",ios::out);

        menu();

        

        while(1)

        {

            cout<<"请选择:";

            cin>>num;

            switch(num)

            {

                case 1:

                    cout<<"请输入5个学生的情况:"<<endl;

                    

                    for(i=0;i<5;i++)

                    {

                        cin>>id>>name>>math>>chinese>>computer;

                        student[i].setGrade(id,name,math,chinese,computer);

                    }

                    table();

                    for(i=0;i<N;i++)

                        student[i].show();

                    break;

                    

                case 2:

                    total_sort(student,N);

                    table();

                    for(i=0;i<N;i++)

                        student[i].show();

                    break;

                    

                case 3:

                    math_sort(student,N);

                    table();

                    for(i=0;i<N;i++)

                        student[i].show();

                    break;

                    

                case 4:

                    cout<<"按语文成绩排序"<<endl;

                    chinese_sort(student,0,N-1);

                    table();

                    for(i=0;i<N;i++)

                        student[i].show();

                    break;

                    

                case 5:

                    computer_sort(student,N);

                    table();

                    for(i=0;i<N;i++)

                        student[i].show();

                    break;

                    

                case 6:

                    cout<<"单科成绩均大于85的学生的成绩:"<<endl;

                    cout<<"学号"<<' ';

                    cout<<"姓名"<<' ';

                    cout<<"数学"<<' ';

                    cout<<"语文"<<' ';

                    cout<<"计算机"<<' ';

                    cout<<"总分"<<' ';

                    cout<<endl;

                    

                    for(i=0;i<N;i++)

                    {

                        if(student[i].getMath()>85 && student[i].getChinese()>85 && student[i].getComputer()>85)

                            student[i].show();

                    }

                    break;

                    

                case 7:

                    cout<<"文件已输出至c:\stu_file.txt"<<endl;

                    ff<<"学号"<<' '

                    <<"姓名"<<' '

                    <<"数学"<<' '

                    <<"语文"<<' '

                    <<"计算机"<<' '

                    <<"总分"<<endl;

                    

                    for(i=0;i<N;i++)

                    {

                        ff<<student[i].getID()<<' '

                        <<student[i].getName()<<' '

                        <<student[i].getMath()<<' '

                        <<student[i].getChinese()<<' '

                        <<student[i].getComputer()<<' '

                        <<student[i].getTotal()<<endl;

                    }

                    break;

                    

                case 0:

                    system("cls");

                    _exit();

                    exit(1);

                    break;

                default:

                    cout<<"没有此选项!";

                    break;

            }

        }

        return 1;

    }

    运行结果:

  • 相关阅读:
    POJ 2155 Matrix(二维树状数组)
    HDU 1280 前m大的数
    HDU 3183 A Magic Lamp(二维RMQ)
    HDU 3743 Frosh Week(归并排序求逆序数)
    POJ 2299 Ultra-QuickSort ( 归并排序 + 求逆序数 )
    HDU 1166 敌兵布阵(树状数组)
    HDU 2846 Repository(字典树)
    HDU 1896 Stones(优先队列)
    HDU 4393 Throw nails(优先队列)
    进程池
  • 原文地址:https://www.cnblogs.com/duanqibo/p/11177887.html
Copyright © 2011-2022 走看看