HDU1872 穩定排序【穩定排序】

穩定排序

Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10289 Accepted Submission(s): 3742

Problem Description
大家都知道,快速排序是不穩定的排序方法。
如果對於數組中出現的任意a[i],aj,其中a[i]==a[j],在進行排序以後a[i]一定出現在a[j]之前,則認爲該排序是穩定的。

某高校招生辦得到一份成績列表,上面記錄了考生名字和考生成績。並且對其使用了某排序算法按成績進行遞減排序。現在請你判斷一下該排序算法是否正確,如果正確的話,則判斷該排序算法是否爲穩定的。

Input
本題目包含多組輸入,請處理到文件結束。
對於每組數據,第一行有一個正整數N(0<N<300),代表成績列表中的考生數目。
接下來有N行,每一行有一個字符串代表考生名字(長度不超過50,僅包含’a’~‘z’),和一個整數代表考生分數(小於500)。其中名字和成績用一個空格隔開。
再接下來又有N行,是上述列表經過某排序算法以後生成的一個序列。格式同上。

Output
對於每組數據,如果算法是正確並且穩定的,就在一行裏面輸出"Right"。如果算法是正確的但不是穩定的,就在一行裏面輸出"Not Stable",並且在下面輸出正確穩定排序的列表,格式同輸入。如果該算法是錯誤的,就在一行裏面輸出"Error",並且在下面輸出正確穩定排序的列表,格式同輸入。

注意,本題目不考慮該排序算法是錯誤的,但結果是正確的這樣的意外情況。

Sample Input
3
aa 10
bb 10
cc 20
cc 20
bb 10
aa 10
3
aa 10
bb 10
cc 20
cc 20
aa 10
bb 10
3
aa 10
bb 10
cc 20
aa 10
bb 10
cc 20

Sample Output
Not Stable
cc 20
aa 10
bb 10
Right
Error
cc 20
aa 10
bb 10

Author
linle

Source
2008浙大研究生複試熱身賽(2)——全真模擬

問題鏈接HDU1872 穩定排序
問題簡述:用穩定排序對一組數據進行排序,比較排序結果與快速排序的結果,並輸出規定的結果。
問題分析
    穩定排序有關概念如下:
穩定排序定義:給定序列中兩個相等的數,經過排序之後,其在序列中的前後位置順序不變。(Ai=Aj,排序前Ai在Aj前面,排序後Ai還在Aj前面)。
穩定排序意義:避免不必要的排序操作,如果序列中的2個數據相同的話。
    穩定排序分類如下:
穩定排序算法:冒泡排序,插入排序、歸併排序、基數排序
不穩定性排序算法:選擇排序、快速排序、希爾排序、堆排序

    C++的STL中含有穩定排序算法函數stable_sort()。這個題中,用該函數算出排序結果,再進行比較。似乎STL中的排序算法函數sort()也是採用了穩定排序算法。

    如果想觀察排序是不是穩定排序,題解程序中,可以在結構Student中增加成員id。
程序說明:(略)
參考鏈接:(略)
題記:(略)

AC的C++語言程序如下:

/* HDU1872 穩定排序 */

#include <bits/stdc++.h>

using namespace std;

const int N = 300;
const int L = 50;
struct Student {
//    int id;
    char name[L + 1];
    int score;
} s[N], a[N];

bool cmp(const Student &a, const Student b)
{
    return a.score > b.score;
}

int main()
{
    int n;
    while(~scanf("%d", &n)) {
        for(int i = 0; i < n; i++) {
//            s[i].id = i;
            scanf("%s", s[i].name);
            scanf("%d", &s[i].score);
        }
        for(int i = 0; i < n; i++) {
//            a[i].id = i;
            scanf("%s", a[i].name);
            scanf("%d", &a[i].score);
        }

        stable_sort(s, s + n, cmp);

        int cnt1 = 0, cnt2 = 0, ans;
        for(int i = 0; i < n; i++) {
            if(s[i].score == a[i].score) cnt1++;
            if(strcmp(s[i].name, a[i].name) == 0) cnt2++;
        }
        if(cnt1 == n && cnt2 == n) ans = 1;
        else if(cnt1 == n && cnt2 != n) ans = 2;
        else ans = 3;

        if(ans == 1) printf("Right\n");
        else {
            if(ans == 2) printf("Not Stable\n");
            else if(ans == 3) printf("Error\n");
            for(int i = 0; i < n; i++)
                printf("%s %d\n", s[i].name, s[i].score);
        }
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章