OpenJudge001:成績排序(解析)

總時間限制:1000ms 內存限制:65536kB
描述

給出班裏某門課程的成績單,請你按成績從高到低對成績單排序輸出,如果有相同分數則名字字典序小的在前。
輸入
第一行爲n (0 < n < 20),表示班裏的學生數目;
接下來的n行,每行爲每個學生的名字和他的成績, 中間用單個空格隔開。名字只包含字母且長度不超過20,成績爲一個不大於100的非負整數。
輸出
把成績單按分數從高到低的順序進行排序並輸出,每行包含名字和分數兩項,之間有一個空格。

樣例輸入

4
Kitty 80
Hanmeimei 90
Joey 92
Tim 28

樣例輸出

Joey 92
Hanmeimei 90 
Kitty 80
Tim 28

解析

這個題目吧,我看到好多人用了sort函數,但是這種簡單的題直接冒泡排序一波就可以吧。
這個題有一點沒有講清楚,那就是,只要求了“把成績單按分數從高到低的順序進行排序並輸出”,而實際上在評判的時候系統還會判斷你有沒有按照名字來排序。因此這裏的要求實際上是兩個,一是對分數排序,二是對分數相同時的名字排序。
這裏涉及到名字排序的問題,也就是對字符串排序,這裏我直接使用了string來定義名字,因此可以直接用 " > < =" 來判斷名字的順序,使用char數組時可以使用cstring裏面的strcmp函數等進行判斷排序。
好啦,讓我們來欣賞一段代碼吧

代碼

#include<iostream>
struct stusco
{
    std::string name;
    int score;
};

int main()
{
    int n;
    std::cin >> n;
    stusco classinfo[n];
    for(int i=0;i<n;i++)
    {
        std::cin >> classinfo[i].name >> classinfo[i].score;
    }
    stusco tmp;
    for(int i=n-1;i>0;i--)
    {
        for(int j=0;j<i;j++)
        {
            if(classinfo[j+1].score>classinfo[j].score)
            {
                tmp=classinfo[j];
                classinfo[j]=classinfo[j+1];
                classinfo[j+1]=tmp;
            }
            if(classinfo[j+1].score==classinfo[j].score&&
                classinfo[j+1].name<classinfo[j].name)  //當分數相同時對name排序
            {
                tmp=classinfo[j];
                classinfo[j]=classinfo[j+1];
                classinfo[j+1]=tmp;
            }
        }  
    }
    for(int i=0;i<n;i++)
    {
        std::cout << classinfo[i].name << " " << classinfo[i].score << "\n";
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章