# Sorting# Struct# Comparison

f277 - 嘿嘿想不到吧

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀取 n 個學生的資料(姓名、班級、座號、個介),並按照班級排序,若班級相同則按照座號排序,最後輸出排序後的學員資料,格式為:班級 座號 姓名,以及個介,每位學員資料間隔一行。

解題思路

這題主要考驗排序的概念。首先定義一個結構體 cls 來儲存學生的資料。然後使用 sort 函數,並自定義比較函數 cmp,來實現按照班級和座號排序的功能。比較函數 cmp 的邏輯是,如果兩個學生的班級不同,則按照班級升序排序;如果班級相同,則按照座號升序排序。最後,按照題目要求的格式輸出排序後的學員資料。

複雜度分析

  • 時間複雜度: O(n log n)
  • 空間複雜度: O(n)

程式碼

#include <iostream>
#include <algorithm> 
using namespace std;
struct cls{
	string name,its;
	int c,num;
};
inline bool cmp(cls x,cls y){
	if(x.c>y.c||(x.c==y.c&&x.num>y.num))return 0;
	return 1;
}
int n;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	cin >> n;
	cls a[n];
	for(int i=0;i<n;++i)
		cin >> a[i].name >> a[i].c >> a[i].num >> a[i].its;
	sort(a,a+n,cmp);
	for(int i=0;i<n;++i)
		cout << a[i].c << " " << a[i].num << " " << a[i].name << "\n" << a[i].its << "\n";
}

Discussion