穩定排序 HDU 1872

2021-08-04 04:47:06 字數 1765 閱讀 2498

大家都知道,快速排序是不穩定的排序方法。

如果對於陣列中出現的任意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之前,則認為該排序是穩定的。某高校招生辦得到乙份成績列表,上面記錄了考生名字和考生成績。並且對其使用了某排序演算法按成績進行遞減排序。現在請你判斷一下該排序...