1. 程式人生 > 實用技巧 >使用C++的sort()排序

使用C++的sort()排序

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

}