11 / 11 / 2
Регистрация: 23.02.2010
Сообщений: 120
|
|
1 | |
Сортировка массива структур...23.02.2010, 14:45. Показов 47088. Ответов 19
Метки нет (Все метки)
Здравствуйте! Не могли бы вы выложить примеры или кинуть ссылочку на интересную статью по сортировке массива структур. Имеется массив структур, каждая структура из 5 полей, где 1 - символьное, а остальные - вещественные числа. Необходимо организовать сортировку данного массива структур по каждому из полю. Как сортировать обычные массивы я знаю, а вот массивы структур не получается. Например, сортировка строк с помощью qsort подходит только для двумерных массивов, здесь же не робит(
1
|
23.02.2010, 14:45 | |
Ответы с готовыми решениями:
19
Сортировка массива структур через сортировку массива указателей Сортировка массива структур Сортировка массива структур Сортировка массива структур |
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
23.02.2010, 14:53 | 2 |
Здесь можно посмотреть алгоритмы сортировки.
Попробуй сортировать массив таким образом:
0
|
11 / 11 / 2
Регистрация: 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
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
23.02.2010, 15:07 | 4 |
WiDe, нет, не так. Тебе нужно будет передавать в не отдельное поле, а сам массив структур. И нужно будет немного переписать функцию, т.к. обычный массив и массив структур - это не одно и то же
0
|
11 / 11 / 2
Регистрация: 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; } } } }
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||
23.02.2010, 15:24 | 6 | |||||
У тебя поля структуры меняться местами не могут, у тебя меняются местами сами структуры в массиве. И у тебя будет уже не шаблон функции:
И при каждой сортировке ты производишь ее только по одному полю, ты не можешь сравнивать одно поле с другим, ты сравниваешь одинаковые поля разных экземпляров структур
1
|
11 / 11 / 2
Регистрация: 23.02.2010
Сообщений: 120
|
|
23.02.2010, 15:27 [ТС] | 7 |
а здесь поподробнее можно? Я так понял тут MyStruct - название самой структуры, а s - объявленный массив типа MyStruct, ну а size это кол-во элементов массива...?
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
23.02.2010, 15:31 | 8 |
Да, здесь ты передаешь ссылку на массив структур s типа MyStruct, вторым параметром ты передаешь размер size этого массива
1
|
11 / 11 / 2
Регистрация: 23.02.2010
Сообщений: 120
|
|
23.02.2010, 15:39 [ТС] | 9 |
Спасибо, сейчас попробую...
Добавлено через 7 минут Не пойму на что ругается: Код
[C++ Error] Unit1.cpp(27): E2023 Array of references is not allowed Хотя нет, из-за &. Убрал, компилятор успокоился...
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||
23.02.2010, 15:45 | 10 | |||||
Запрещены массивы ссылок
Нет, size_t - это стандартный тип (беззнаковое целое) Попробуй так:
0
|
11 / 11 / 2
Регистрация: 23.02.2010
Сообщений: 120
|
|
23.02.2010, 15:53 [ТС] | 11 |
Не, тоже не робит... Работает только так:
Код
void bubbleSort(MyStruct s[], size_t size); Спасибо тебе огромное за помощь! Теперь вот как сортировать поля, которые типа char???
0
|
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||||||
23.02.2010, 15:57 | 12 | |||||
А лучше - просто
хм... опоздал... В общем, открой для себя "прелести" std::sort и индексов. std::sort (подключать <algorithm>) позволяет сортировать что угодно. Надо только написать операцию сравнения "меньше". А индекс - это массив номеров, который используется для доступа.
0
|
11 / 11 / 2
Регистрация: 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; } } } }
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
23.02.2010, 16:03 | 14 |
WiDe,
Nick Alte, чего-то я намудрил Функция 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
|
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
23.02.2010, 16:05 | 15 |
Если у тебя есть массив A размером N, то индекс I - это массив целых чисел того же размера. Изначально ты заносишь туда последовательные значения от 1 до N - это номера. А потом сортируешь уже сам индекс так, чтобы порядок номеров в нём определял порядок сортировки. То есть, значения в A как были неупорядочены, так и идут, но если ты идёшь по индексу последовательно, то выбранные соответствующие значения (A[I[i]]) будут упорядочены. Преимущество в том, что для одного массива структур ты можешь иметь несколько индексов, которые указывают порядок сортировки по разным полям.
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|||||||||||
23.02.2010, 16:07 | 16 | ||||||||||
Попробуй объявить структуру так:
Добавлено через 1 минуту Тогда прототип функции будет у тебя выглядеть так:
1
|
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||||||
23.02.2010, 16:20 | 17 | |||||
Теперь о сортировке std::sort. Для неё надо определить операцию сравнения. Чтобы сортировать индекс, надо показать sort, что сравнивать надо не сами элементы индекса, а соответствующие им элементы основного массива. Хотя перемещаются при этом именно элементы индекса. Для этого надо написать класс с операцией вызова, в которой заложено нужное сравнение, и передать его в sort.
1
|
11 / 11 / 2
Регистрация: 23.02.2010
Сообщений: 120
|
|
23.02.2010, 16:23 [ТС] | 18 |
Хорошая идея, спасибо!
Добавлено через 2 минуты Nick Alte, классы ещё не изучал, к сожалению. Точно не знаю, но либо в этот понедельник, либо в следующий их пройдём и тогда попробую "переварить", написанное вами. Спасибо за информацию!
0
|
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||||||
23.02.2010, 17:44 | 19 | |||||
В принципе, можно и функциями, но тогда придётся задействовать глобальные переменные, а это нехорошо. Классами аккуратнее. Но тем не менее для повышения понятности вот как то же самое будет выглядеть:
0
|
11 / 11 / 2
Регистрация: 23.02.2010
Сообщений: 120
|
|
23.02.2010, 19:25 [ТС] | 20 |
Сделал так:
Код
if ( strcmp(temp[j-1].name, temp[j].name)>0 ) { x=temp[j-1]; temp[j-1]=temp[j]; temp[j]=x; }
0
|
23.02.2010, 19:25 | |
23.02.2010, 19:25 | |
Помогаю со студенческими работами здесь
20
Сортировка массива структур Сортировка массива структур Сортировка массива структур Сортировка массива структур Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |