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;
}