【題目鏈接】
ybt 1178:成績排序
OpenJudge NOI 1.10 03:成績排序
【題目考點】
1. 結構體 排序
【君義精講】排序算法
2. 多關鍵字排序
方法1:將多關鍵字的排序條件整合為單一排序條件
方法2:使用穩定的排序算法進行多趟排序
【解題思路】
對結構體對象排序,比較的是成員變量,交換的是對象
【題解代碼】
解法1:將多關鍵字的排序條件整合為單一排序條件
整合成的排序條件為:分數更高,或分數相同且名字字典序小,則排在前面。
#include<bits/stdc++.h>
using namespace std
;
struct Stu
{char name
[25];int score
;
};
bool isPrior(Stu
&a
, Stu
&b
)
{return a
.score
> b
.score
|| a
.score
== b
.score
&& strcmp(a
.name
, b
.name
) < 0;
}
int main()
{Stu stu
[25];int n
;cin
>> n
;for(int i
= 1; i
<= n
; ++i
)cin
>> stu
[i
].name
>> stu
[i
].score
;for(int i
= 1; i
<= n
-1; ++i
)for(int j
= 1; j
<= n
-i
; ++j
)if(isPrior(stu
[j
+1], stu
[j
]))swap(stu
[j
], stu
[j
+1]); for(int i
= 1; i
<= n
; ++i
)cout
<< stu
[i
].name
<< ' ' << stu
[i
].score
<< endl
;return 0;
}
#include<bits/stdc++.h>
using namespace std
;
struct Stu
{char name
[25];int score
;
};
bool isPrior(Stu
&a
, Stu
&b
)
{return a
.score
> b
.score
|| a
.score
== b
.score
&& strcmp(a
.name
, b
.name
) < 0;
}
int main()
{Stu stu
[25];int n
;cin
>> n
;for(int i
= 1; i
<= n
; ++i
)cin
>> stu
[i
].name
>> stu
[i
].score
;for(int i
= 2; i
<= n
; ++i
){for(int j
= i
; j
> 1; --j
){if(isPrior(stu
[j
], stu
[j
-1]))swap(stu
[j
], stu
[j
-1]);elsebreak; }}for(int i
= 1; i
<= n
; ++i
)cout
<< stu
[i
].name
<< ' ' << stu
[i
].score
<< endl
;return 0;
}
#include<bits/stdc++.h>
using namespace std
;
struct Stu
{char name
[25];int score
;
};
bool cmp(Stu a
, Stu b
)
{return a
.score
> b
.score
|| a
.score
== b
.score
&& strcmp(a
.name
, b
.name
) < 0;
}
int main()
{Stu stu
[25];int n
;cin
>> n
;for(int i
= 1; i
<= n
; ++i
)cin
>> stu
[i
].name
>> stu
[i
].score
;sort(stu
+1, stu
+1+n
, cmp
); for(int i
= 1; i
<= n
; ++i
)cout
<< stu
[i
].name
<< ' ' << stu
[i
].score
<< endl
;return 0;
}
解法2:使用穩定的排序算法進行多趟排序
采用穩定的排序算法,先按名字字典序從小到大排序,再按成績由高到低進行排序。
可以采用冒牌、插入,歸并等穩定的排序算法。這里直接使用stable_sort進行排序。
#include<bits/stdc++.h>
using namespace std
;
struct Stu
{char name
[25];int score
;
};
bool cmp1(Stu a
, Stu b
)
{return strcmp(a
.name
, b
.name
) < 0;
}
bool cmp2(Stu a
, Stu b
)
{return a
.score
> b
.score
;
}
int main()
{Stu stu
[25];int n
;cin
>> n
;for(int i
= 1; i
<= n
; ++i
)cin
>> stu
[i
].name
>> stu
[i
].score
;stable_sort(stu
+1, stu
+1+n
, cmp1
);stable_sort(stu
+1, stu
+1+n
, cmp2
);for(int i
= 1; i
<= n
; ++i
)cout
<< stu
[i
].name
<< ' ' << stu
[i
].score
<< endl
;return 0;
}
總結
以上是生活随笔為你收集整理的信息学奥赛一本通 1178:成绩排序 | OpenJudge NOI 1.10 03:成绩排序的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。