10263. Сортировка
людей
Имеются n людей, про каждого из которых известны имя, фамилия, год рождения.
Отсортируйте их сначала лексикографически по фамилии, затем по имени. Если
людей с одинаковой фамилией и именем будет несколько, то упорядочьте их по
убыванию года рождения.
Вход.
Первая строка содержит количество людей n (1 ≤ n ≤ 100). Каждая из следующих n строк содержит имя, фамилию и возраст одного человека. Имя и фамилия
содержат не более 20 символов.
Выход.
Выведите данные про людей согласно условию сортировки.
Пример входа |
Пример выхода |
|
6 Mila Catron 1977 Ivan Mendel 1956 Mihail Egorov 1980 Eric Catron 1977 Mihail Egorov 1988 Petr Mendel 1990 |
Eric Catron 1977 Mila Catron 1977 Mihail Egorov 1988 Mihail Egorov 1980 Ivan Mendel 1956 Petr Mendel 1990 |
|
сортировка
- структуры
Объявим массив
структур person,
прочитаем данные. Отсортируем структуры согласно условию сортировки.
Реализация алгоритма
Объявим струтуру person.
struct person
{
char name[21];
char surname[21];
int year;
};
Объявим массив структур для хранения всех данных.
struct person p[101];
Функция swap меняет местами людей a и b.
void swap(person &a, person &b)
{
person temp = a; a = b; b = temp;
}
Функция f сравнивает двух людей a и b.
int f(person a, person b)
{
if (strcmp(a.surname,
b.surname) != 0)
return strcmp(a.surname,
b.surname) < 0;
if (strcmp(a.name, b.name) != 0)
return strcmp(a.name, b.name) < 0;
return a.year > b.year;
}
Основная часть программы. Читаем входные даные. Заносим
информацию о людях в массив структур p.
scanf("%d", &n);
for (i = 0;
i < n; i++)
scanf("%s %s %d", &p[i].name, &p[i].surname, &p[i].year);
Сортируем людей при помощи обменной сортировки.
for (i = 0;
i < n; i++)
for (j = i
+ 1; j < n; j++)
if (!f(p[i], p[j])) swap(p[i], p[j]);
Выводим людей в отсортированном порядке.
for (i = 0;
i < n; i++)
printf("%s %s %d\n", p[i].name,
p[i].surname, p[i].year);
Реализация алгоритма – sort STL
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int n, i,
j;
struct person
{
string name;
string surname;
int year;
};
struct person p[100];
int f(person a, person b)
{
if (a.surname != b.surname) return a.surname < b.surname;
if (a.name != b.name) return a.name < b.name;
return a.year > b.year;
}
int main(void)
{
scanf("%d", &n);
for (i = 0; i < n; i++)
cin >> p[i].name >> p[i].surname >> p[i].year;
sort(p, p + n, f);
for (i = 0; i < n; i++)
cout <<
p[i].name << " " << p[i].surname << " " <<
p[i].year << endl;
return 0;
}