使用C++的sort()排序
阿新 • • 發佈:2021-01-20
C++庫函式sort()可以提供對各種型別資料的排序,有三個引數。前兩項指定排序的物件,最後一項為自定義比較規則的cmp(compare)函式。
【例項1】
有一組學生的資訊。給出每個學生的學號和分數,按分數從高到低排序。分數相同的,按學號從低到高排序。
輸入格式:
第一行給出學生數量n。
下面給出n行學生的學號和分數,中間以空格連線。
輸出格式:
輸出n行學生的學號和分數,中間以空格連線。
輸入樣例:
5
10002 96
10005 100
10004 97
10003 97
10001 99
輸出樣例:
10005 100
10001 99
10003 97
10004 97
10002 96
程式碼:
#include<iostream> #include<algorithm> using namespace std; struct student { char id[15]; int score; }stu[10]; bool cmp(student x, student y) { if (x.score != y.score) return x.score > y.score; //分數從大到小 else return strcmp(x.id, y.id) < 0; //學號從小到大 } int main() { int n; cin >> n; //學生數量 for (int i = 0; i < n; ++i) { cin >> stu[i].id; cin >> stu[i].score; } sort(stu, stu + n, cmp); for (int i = 0; i < n; ++i) { cout << stu[i].id << " " << stu[i].score; cout << endl; } }
【PAT A1025】
題目連結:https://pintia.cn/problem-sets/994805342720868352/problems/994805474338127872
思路:
對n個考場的排序用一個大迴圈控制,共做n次。
在每一次中,先讀取所有考生的資訊,然後對該考場的考生排序和計算排名。
n次完成後,再對所有考生做一次排序和計算排名。
最後輸出所要的資訊。
sort()排序的方法和上面一樣。
程式碼:
#include <iostream> #include <algorithm> #include <cstring> //for g++ using namespace std; struct student { char id[13]; //考生號 int score; //分數 int location_number; //考場號 int local_rank; //考場內排名 int total_rank; //總排名 }stu[30000]; bool cmp(student x, student y) { if (x.score != y.score) return x.score > y.score; //分數從大到小 else return strcmp(x.id, y.id) < 0; //考生號從小到大 } int main() { int n; int i, j, k; int num = 0; //考生人數 cin >> n; //考場數量 for (i = 1; i <= n; ++i) { cin >> k; //考場內人數 //讀入考場內所有考生的資訊 for (j = 1; j <= k; ++j) { cin >> stu[num].id; cin >> stu[num].score; stu[num].location_number = i; ++num; } //對考場內考生排序 sort(stu + num - k, stu + num, cmp); //計算考場內的排名 stu[num - k].local_rank = 1; for (j = num - k + 1; j < num; ++j) { if (stu[j].score == stu[j - 1].score) stu[j].local_rank = stu[j - 1].local_rank; else stu[j].local_rank = j + 1 - (num - k); } } //對全體考生排序 sort(stu, stu + num, cmp); //計算全體考生的排名 stu[0].total_rank = 1; for (j = 1; j < num; ++j) { if (stu[j].score == stu[j - 1].score) stu[j].total_rank = stu[j - 1].total_rank; else stu[j].total_rank = j + 1; } //輸出結果 cout << num << endl; for (j = 0; j < num; ++j) { cout << stu[j].id << " "; cout << stu[j].total_rank << " "; cout << stu[j].location_number << " "; cout << stu[j].local_rank; cout << endl; } }