Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 72, средняя оценка - 4.92
WiDe
10 / 10 / 1
Регистрация: 23.02.2010
Сообщений: 120
#1

Сортировка массива структур... - C++

23.02.2010, 14:45. Просмотров 11094. Ответов 19
Метки нет (Все метки)

Здравствуйте! Не могли бы вы выложить примеры или кинуть ссылочку на интересную статью по сортировке массива структур. Имеется массив структур, каждая структура из 5 полей, где 1 - символьное, а остальные - вещественные числа. Необходимо организовать сортировку данного массива структур по каждому из полю. Как сортировать обычные массивы я знаю, а вот массивы структур не получается. Например, сортировка строк с помощью qsort подходит только для двумерных массивов, здесь же не робит(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2010, 14:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сортировка массива структур... (C++):

Сортировка массива структур через сортировку массива указателей - C++
Ошибка возникает в функции void sort(student **ppStud, int k, char ch). Кто видит ошибку - помогите, пожалуйста. Код программы: ...

Сортировка массива структур - C++
Ругается на использование структуры, соответственно не работает вся программа. Задача: отсортировать массив по типу культур. struct...

Сортировка массива структур - C++
Разработать программу, реализующую сортировку массива структур (50 элементов). В качестве элемента массива выбрать структуру,...

Сортировка массива структур - C++
имеется структура struct { char lastname, firstname; unsigned int math, inf, phys; }rat, temp; необходимо отсортировать...

Сортировка массива структур - C++
Дана структура WORKER и массив из 10 стркутур. Нужно 1)сортировать список 2) вывести на экран рабочих чей стаж больше числа введённого с...

Сортировка массива структур - C++
Разьясните пожалуйста в как можно поступить по другому. Не выделяя, как у меня дополнительный массив. #include<iostream> const...

19
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
23.02.2010, 14:53 #2
Здесь можно посмотреть алгоритмы сортировки.
Попробуй сортировать массив таким образом:
  1. Сначала отсортируй массив структур по первому полю
  2. Затем уже отсортированный массив отсортируй по второму полю
  3. И т.д.
  4. Отсортируй массив по последнему полю
0
WiDe
10 / 10 / 1
Регистрация: 23.02.2010
Сообщений: 120
23.02.2010, 15:00  [ТС] #3
Ну эт я примерно понимаю, ток реализовать никак не могу. Возьмём, например, сортировку пузырьком. То вместо:
Код
void bubbleSort(T a[], long size) {
мне надо писать:
Код
void bubbleSort(T moya_structura[].moe_pole, long size) {
И потом вызывать функцию так:
Код
bubbleSort(moya_structura.moe_pole, razmer_massiva)
Или не так?
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
23.02.2010, 15:07 #4
WiDe, нет, не так. Тебе нужно будет передавать в не отдельное поле, а сам массив структур. И нужно будет немного переписать функцию, т.к. обычный массив и массив структур - это не одно и то же
0
WiDe
10 / 10 / 1
Регистрация: 23.02.2010
Сообщений: 120
23.02.2010, 15:15  [ТС] #5
Код
template<class T>
void bubbleSort(T a[], long size) {
  long i, j;
  T x;

  for( i=0; i < size; i++) {
    for( j = size-1; j > i; j-- ) {
      if ( a[j-1].pole_1 > a[j].pole_1 ) {
      x=a[j-1].pole_1;
      a[j-1].pole=a[j].pole_1;
      a[j].pole_1=x;

      x=a[j-1].pole_2;
      a[j-1].pole=a[j].pole_2;
      a[j].pole_2=x;
    }
  }
}
}
А так? Т.е. типа если у нас в структуре 2 поля, и сортируем мы по первому, то, если выполняется условие, меняются местами оба поля структуры. Или опять не там мыслю?
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
23.02.2010, 15:24 #6
У тебя поля структуры меняться местами не могут, у тебя меняются местами сами структуры в массиве. И у тебя будет уже не шаблон функции:
C++
1
void bubbleSort(MyStruct &s[], size_t size);
Добавлено через 1 минуту
И при каждой сортировке ты производишь ее только по одному полю, ты не можешь сравнивать одно поле с другим, ты сравниваешь одинаковые поля разных экземпляров структур
1
WiDe
10 / 10 / 1
Регистрация: 23.02.2010
Сообщений: 120
23.02.2010, 15:27  [ТС] #7
Цитата Сообщение от Nameless One Посмотреть сообщение
void bubbleSort(MyStruct &s[], size_t size)
а здесь поподробнее можно? Я так понял тут MyStruct - название самой структуры, а s - объявленный массив типа MyStruct, ну а size это кол-во элементов массива...?
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
23.02.2010, 15:31 #8
Да, здесь ты передаешь ссылку на массив структур s типа MyStruct, вторым параметром ты передаешь размер size этого массива
1
WiDe
10 / 10 / 1
Регистрация: 23.02.2010
Сообщений: 120
23.02.2010, 15:39  [ТС] #9
Спасибо, сейчас попробую...

Добавлено через 7 минут
Не пойму на что ругается:
Код
[C++ Error] Unit1.cpp(27): E2023 Array of references is not allowed
По моему из-за size_t, так как он его жирным не выделил, как слово void, например. Я кодю на Borland C++ Builder.

Хотя нет, из-за &. Убрал, компилятор успокоился...
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
23.02.2010, 15:45 #10
Цитата Сообщение от WiDe Посмотреть сообщение
[C++ Error] Unit1.cpp(27): E2023 Array of references is not allowed
Запрещены массивы ссылок


Цитата Сообщение от WiDe Посмотреть сообщение
По моему из-за size_t, так как он его жирным не выделил, как слово void, например. Я кодю на Borland C++ Builder.
Нет, size_t - это стандартный тип (беззнаковое целое)
Попробуй так:
C++
1
void bubbleSort(MyStruct &(*s), size_t size);
0
WiDe
10 / 10 / 1
Регистрация: 23.02.2010
Сообщений: 120
23.02.2010, 15:53  [ТС] #11
Не, тоже не робит... Работает только так:
Код
void bubbleSort(MyStruct s[], size_t size);
Всё, сделал сортировку, получилось!
Спасибо тебе огромное за помощь! Теперь вот как сортировать поля, которые типа char???
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
23.02.2010, 15:57 #12
А лучше - просто
C++
1
void bubbleSort(MyStruct s[], size_t size);
Так даже будет работать.

хм... опоздал...

В общем, открой для себя "прелести" std::sort и индексов. std::sort (подключать <algorithm>) позволяет сортировать что угодно. Надо только написать операцию сравнения "меньше". А индекс - это массив номеров, который используется для доступа.
0
WiDe
10 / 10 / 1
Регистрация: 23.02.2010
Сообщений: 120
23.02.2010, 16:00  [ТС] #13
Код
void bubbleSort(line temp[], size_t size) {
  long i, j;
  line x;

  for( i=0; i < size; i++) {            // i - íîìåð ïðîõîäà
    for( j = size-1; j > i; j-- ) {     // âíóòðåííèé öèêë ïðîõîäà
      if ( temp[j-1].kkal > temp[j].kkal ) {
      x=temp[j-1]; temp[j-1]=temp[j]; temp[j]=x;
    }
  }
}
}
Здесь kkal - это одно из полей из структуры. А как сделать чтобы можно было передавать в функцию это имя, чтобы потом отсортировать другие поля, не создавая функции для каждого из них?
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
23.02.2010, 16:03 #14
WiDe,
Nick Alte, чего-то я намудрил

Цитата Сообщение от WiDe Посмотреть сообщение
Спасибо тебе огромное за помощь! Теперь вот как сортировать поля, которые типа char???
Функция strcmp

Добавлено через 2 минуты
Код
int strcmp(
   const char *string1,
   const char *string2 
);
Return Value
The return value for each of these functions indicates the lexicographic relation of string1 to string2.

Value
 Relationship of string1 to string2
 
< 0
 string1 less than string2
 
0
 string1 identical to string2
 
> 0
 string1 greater than string2
1
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
23.02.2010, 16:05 #15
Если у тебя есть массив A размером N, то индекс I - это массив целых чисел того же размера. Изначально ты заносишь туда последовательные значения от 1 до N - это номера. А потом сортируешь уже сам индекс так, чтобы порядок номеров в нём определял порядок сортировки. То есть, значения в A как были неупорядочены, так и идут, но если ты идёшь по индексу последовательно, то выбранные соответствующие значения (A[I[i]]) будут упорядочены. Преимущество в том, что для одного массива структур ты можешь иметь несколько индексов, которые указывают порядок сортировки по разным полям.
0
23.02.2010, 16:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2010, 16:05
Привет! Вот еще темы с ответами:

Сортировка массива структур - C++
Привет всем ! как отсортировать массив структур ? а то почему не получается ... вот код #include &lt;iostream&gt; #include &lt;stdio.h&gt; ...

Сортировка массива структур - C++
Имеется массив структур, который необходимо отсортировать по числовому ключу. Я написал код, но он не работает, поэтому просьба указать на...

Сортировка массива структур - C++
В общем, то что в названии темы, то и не получается. Не хочет присваиваться адрес предыдущей ячейки в массиве stud1.h #include...

Сортировка массива структур - C++
Здравствуйте! Помогите пожалуйста реализовать сортировку массива структур по полю &quot;date&quot; (все записи должны быть отсортированны по дате)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru