大家都知道,快速排序是不穩定的排序方法。
如果對於陣列中出現的任意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
題解:
這道題是穩定排序,而原先的sort函式是不穩定排序,這時只需要在定義結構體時多定義乙個變數用來儲存輸入資料時的位置即可。
然後在運用sort進行排序時遇到相同的資料時,只需要比較額外定義的那個記錄輸入資料時記錄位置的變數即可。
**如下:
#include
#include
#include
#include
using namespace std;
struct nodep[305],q[305];
bool cmp1(node w,node m)else
if(w.b==m.b)else
}int main()
for(int i=0;i"%s",q[i].a);
scanf("%d",&q[i].b);
}sort(p,p+n,cmp1);
int suan=0;
int wen=0;
for(int i=0;iif(p[i].b==q[i].b) suan++;
if(strcmp(p[i].a,q[i].a)==0) wen++;
}if(suan==n&&wen==n)else
if(suan==n&&wen!=n)
}else}}
return
0;}
hdu 1872 穩定排序
題目傳送門 hdu 1872 problem description 大家都知道,快速排序是不穩定的排序方法。如果對於陣列中出現的任意a i aj,其中a i a j 在進行排序以後a i 一定出現在a j 之前,則認為該排序是穩定的。某高校招生辦得到乙份成績列表,上面記錄了考生名字和考生成績。並且...
HDU 1872 穩定排序
problem description 大家都知道,快速排序是不穩定的排序方法。如果對於陣列中出現的任意a i a j i input 本題目包含多組輸入,請處理到檔案結束。對於每組資料,第一行有乙個正整數n 0 output 對於每組資料,如果演算法是正確並且穩定的,就在一行裡面輸出 right ...
HDU 1872 穩定排序
大家都知道,快速排序是不穩定的排序方法。如果對於陣列中出現的任意a ii,aj j ii i aj j,在進行排序以後ai i一定出現在aj j之前,則認為該排序是穩定的。某高校招生辦得到乙份成績列表,上面記錄了考生名字和考生成績。並且對其使用了某排序演算法按成績進行遞減排序。現在請你判斷一下該排序...