Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2010, 19:27   #1
Чубрик
Новичок
Джуниор
 
Регистрация: 22.01.2010
Сообщений: 3
По умолчанию Си : сортировка массива структур

Добрый день.
Подскажите такую вещь:
есть массив структур (предположим, элементамы структур surname, name, age), Нужно отсортировать элементы сначала по surname, затем по name, ну и затем по age. Как сделать это по одному полю я знаю. А вот как сделать так, чтобы при второй сортировке не нарушалась последовательность предыдущей?

спасибо.
Чубрик вне форума Ответить с цитированием
Старый 22.01.2010, 20:50   #2
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

Самое банальное отсортировать еще раз с дополнительным условием "если первые параметры равны" =)
[MI_nor] вне форума Ответить с цитированием
Старый 22.01.2010, 23:10   #3
Чубрик
Новичок
Джуниор
 
Регистрация: 22.01.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от [MI_nor] Посмотреть сообщение
Самое банальное отсортировать еще раз с дополнительным условием "если первые параметры равны" =)

где это условие должно указываться? в функции сравнения? и что нужно возвращать, если "первые параметры" неравны?
если создать еще одну функцию сравнения и в ней возвращать результат сравнения параметров при условии, что первые параметры равны, то эти строки сортируются правильно. А вот первое условие на все остальные элементы уже не выполняется.
Чубрик вне форума Ответить с цитированием
Старый 22.01.2010, 23:40   #4
Чубрик
Новичок
Джуниор
 
Регистрация: 22.01.2010
Сообщений: 3
По умолчанию

Сам отвечу на свой вопрос : да, в функции сравнения и надо устраивать проверки
Чубрик вне форума Ответить с цитированием
Старый 23.01.2010, 21:47   #5
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

Когда-то давно сортировал(сейчас этот код стыдно показывать =) )
Код:
void sort_vib(vesh array[], int b[], int size)
  {
	int temp;
	int min_i,i,j;
	for (i=0;i<size;i++)
	 {
	  b[i]=i;
	 }
	for (i=0;i<size-1;i++)
	{
	min_i = i;
	for (j = i + 1; j < size; j++) {
		if (strcmp(array[b[j]].provod,array[b[min_i]].provod)<0) {
			min_i = j;
		}
	}
	temp = b[i];
	b[i] = b[min_i];
	b[min_i] = temp;
       }
    for (i=0;i<size-1;i++)
	{
	min_i = i;
	for (j = i + 1; j < size; j++) {
	       if (strnicmp(array[b[j]].provod,array[b[min_i]].provod,1)==0){
		if (strcmp(array[b[j]].name,array[b[min_i]].name)<0) {
			min_i = j;
		}                                                    }
	}
	temp = b[i];
	b[i] = b[min_i];
	b[min_i] = temp;
       }
  }
Тут идет сортировка по параметру provod, а потом по name...
Сортировка выбором по индексам
[MI_nor] вне форума Ответить с цитированием
Старый 23.01.2010, 22:02   #6
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

Я бы посоветовал вам написать ф-ию, которая определяет, какое из значений стрктур меньше.
что-нибудь типа такого:
bool IsFirstLess(const vesh& first, const vesh& second)
{
// Определяет, является ли значение первой структуры меньше значения второй.

// тут код, который сперва проверяет первые поля структур,
// и если они одинаковые, проверяет сдедующие и т.д.
}

тогда код сортировки выглядит также как и при сортировке простых целых чисел. Для целых чисел это выглядит примерно так: if (a < b) ...
а для структур будет так: if (IsFirstLess(veshA, veshB)) ...

Тут немного из с++ взято, но суть я думаю вам ясна. Такой вариант проще да и отсортируется все за один проход

Последний раз редактировалось _Ч_; 23.01.2010 в 22:09.
_Ч_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнение массива структур данными из файла Brutallus Общие вопросы C/C++ 0 26.11.2009 19:01
[C++] Инициализация массива структур отдельно от объявления MariyaL Помощь студентам 0 30.09.2009 12:27
Сортировка массива структур. nec117 Общие вопросы C/C++ 5 22.02.2009 18:01
Сортировка массива структур arturka Помощь студентам 1 21.06.2008 14:15