Пожалуйста, помогите - сортировка целых чисел в структурах - PullRequest
1 голос
/ 07 июня 2010

У меня есть такая структура:

struct db {
 string name,sur;
 int num;
};

И объявлен массив структур db:

struct db a[10];

, и каждый член [] заполнен именем, фамилиейи номер, но один и тот же номер может появляться несколько раз.Мне нужно отсортировать числа и напечатать результаты, то есть отсортировать по num каждой структуры и напечатать имя, sur и num в каждой строке, начиная с наименьшего num и заканчивая самым большим.Я не знаю, как это сделать, пожалуйста, помогите мне.

Ответы [ 4 ]

6 голосов
/ 07 июня 2010

Во-первых, в C ++ вам не нужно каждый раз повторять "struct".

Вы можете использовать функцию std :: sort () и задать ей собственный предикат.

bool db_cmp(const db &left, const db &right)
{
    return left.num < right.num;
}

//...

db a[10];
std::sort(a, a + 10, db_cmp);
// then, display the contents of a..
4 голосов
/ 07 июня 2010

Вы можете использовать qsort .

int db_comparator ( const void * elem1, const void * elem2 )
{
  struct db *first = (struct db *) elem1, *second = (struct db *) elem2;
  return first->num - second->num;
}

qsort(a, sizeof(a)/sizeof(a[0]), sizeof(a[0]), db_comparator);
1 голос
/ 07 июня 2010

Вам нужно реализовать собственный алгоритм сортировки?

Если это так, я настоятельно рекомендую набрать "Алгоритмы сортировки" в Google и / или проверить страницу википедии .

Пузырьковая сортировка ДЕЙСТВИТЕЛЬНО проста в реализации (но это плохой алгоритм сортировки). Это будет сводиться к проверке каждого числа друг против друга, а затем поменять их местами одно меньше другого. Сортировка строк также проста, так как strcmp возвращает вам значение меньше 0 для строки «меньше», чем сравниваемой и больше нуля для одного «больше».

Если вам не нужно реализовывать собственный алгоритм, используйте std :: sort.

0 голосов
/ 08 июня 2010

Вы можете добавить метод сравнения в свою структуру:

struct db
{
  string name;
  string sur;
  int    num;

  bool operator <(const db& other)
  {
    if (name == other.name)
    {
      return sur < other.sur;
    }
    return name < other.name;
};

Теперь вы можете использовать алгоритм std::sort, поскольку для вашего объекта определен оператор '<'. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...