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;

}