2

我有 5 名学生的姓名和他们 3 门科目的成绩,我计算了他们 3 门课程的平均成绩。但是我需要用他们的数据(名字、3门课程的成绩和平均水平)从平均最高到最低的一个对它们进行排序。谁能告诉我我的代码有什么问题?这是我的代码...

# include <iostream>
# include <string>
# include <iomanip>
using namespace std;
void read(string names[],double grades[][4],int n);
void average(double grades[][4], int n);
void sort(string names[],double grades[][4], int n);
int main()
{
    string names[5]; double grades[5][4];
    cout<<fixed<<showpoint<<setprecision (2);
    cout<<" please enter the names and grades(math,phy,cpp) for 5 students\n";
    read(names,grades,5);
    average(grades,5);
    sort(names,grades,5);
    for(int rows=0; rows<5; rows++)
    {
        cout<<names[rows]<<"\t";
        for( int col=0; col<4; col++)
        {
            cout<<grades[rows][col]<<"\t";
        }
        cout<<endl;
    }







    system("pause");
    return 0;
}
void read(string names[],double grades[][4],int n)
{
    for(int rows=0; rows<n; rows++)
    {
            cin>>names[rows];
        for( int col=0; col<3; col++)
        { 
            cin>>grades[rows][col];
        }
    }
    system("cls");
}
void average(double grades[][4], int n)
{
    double sum;
    for(int rows=0; rows<n; rows++)
    {
        sum=0.0;
        for(int col=0; col<3;col++)
        {
            sum=sum+grades[rows][col];
        }
        grades[rows][3]=sum/3;
    }
}

void sort(string names[],double grades[][4], int n)
{
    double temp;int end=n;string swap_names;


    for(int rows=0; rows<end; rows++)
    {
        if(grades[rows][3]> grades[rows+1][3])
        {
            for(int col=0; col<4;col++)
            {
                temp=grades[rows+1][col];
                grades[rows+1][col]=grades[rows][col];
                grades[rows][col]=temp;
            }
            swap_names=names[rows+1];
            names[rows+1]=names[rows];
            names[rows]=swap_names;
        }
    }


}

谢谢。

4

2 回答 2

0

问题出在你的sort()功能上。冒泡排序是O(n 2 )排序,因为您sort()只需要O(n)时间,这是正确的。

试试这个更正的代码sort()

void sort(string names[],double grades[][4], int n)
{
    double temp;
    int end=n;
    string swap_names;
    for(int rows1=0; rows1<end; rows1++)
    {

      for(int rows2=0; rows2<end; rows2++)
      {
        if(grades[rows1][3] < grades[rows2][3])
        {
            for(int i=0; i<4; i++)
            {
                temp=grades[rows1][i];
                grades[rows1][i]=grades[rows2][i];
                grades[rows2][i]=temp;
            }
            swap_names=names[rows1];
            names[rows1]=names[rows2];
            names[rows2]=swap_names;
        }
      } 
   }
}
于 2013-05-27T10:35:29.247 回答
0

您的排序算法尚未完成。它是所谓的冒泡排序算法的一次迭代,有关详细信息,请参阅冒泡排序。但是,冒泡排序的性能确实很差,如果您的数据库很大,那么您应该真正考虑使用其中一条评论中建议的库中的排序。

于 2013-05-27T09:50:41.900 回答