Методы сортировки в структуре(си) - C (СИ)
Формулировка задачи:
мне нужно в структуре сделать сортировку по выбранному полю. пробовала с qsort, для меня сложновато, подскажите какой-нибудь метод попроще, может на примере какой нибудь программы. спасибо.
может методом пузырька? но тогда я знаю как только с одним определенным полем..
Решение задачи: «Методы сортировки в структуре(си)»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
typedef struct PERSON {
char * name;
int age;
} person_t;
void swap_persons(person_t * a, person_t * b){
person_t t = *a;
*a = *b;
*b = t;
}
person_t * min_name(const person_t * persons, size_t count){
return ( count < 2 ) ? (person_t*)persons : ( strcmp(persons->name, (persons+count-1)->name) > 0 ) ?
min_name(persons+1, count-1) : min_name(persons, count-1);
}
person_t * min_age(const person_t * persons, size_t count){
return ( count < 2 ) ? (person_t*)persons : ( persons->age > (persons+count-1)->age ) ?
min_age(persons+1, count-1) : min_age(persons, count-1);
}
void sort_by_name(person_t * persons, size_t count){
if ( count > 1 ){
person_t * m = min_name(persons, count);
if ( m != persons )
swap_persons(persons, m);
sort_by_name(persons+1, count-1);
}
}
void sort_by_age(person_t * persons, size_t count){
if ( count > 1 ){
person_t * m = min_age(persons, count);
if ( m != persons )
swap_persons(persons, m);
sort_by_age(persons+1, count-1);
}
}
void dump(const person_t * persons, size_t count){
printf("Name Age\n");
while ( count-- ){
printf("%-20s%d\n", persons->name, persons->age);
++persons;
}
}
#define NUM_PERSONS 3
int main(void){
person_t persons[NUM_PERSONS] = {
{ "Sidorov", 34 },
{ "Ivanov", 40 },
{ "Petrov", 29 }
};
printf("Unsorted:\n");
dump(persons, NUM_PERSONS);
sort_by_name(persons, NUM_PERSONS);
printf("Sorted by name:\n");
dump(persons, NUM_PERSONS);
sort_by_age(persons, NUM_PERSONS);
printf("Sorted by age:\n");
dump(persons, NUM_PERSONS);
return 0;
}
Объяснение кода листинга программы
- Структура
person_tобъявляет переменныеnameиageтипаchar*иintсоответственно. - Функция
swap_personsменяет местами указатели на структурыperson_tвaиb. - Функция
min_nameнаходит минимальный элемент в массиве структурperson_tпо полюnameи возвращает указатель на этот элемент. - Функция
min_ageнаходит минимальный элемент в массиве структурperson_tпо полюageи возвращает указатель на этот элемент. - Функция
sort_by_nameсортирует массив структурperson_tпо полюname. - Функция
sort_by_ageсортирует массив структурperson_tпо полюage. - Функция
dumpвыводит на экран содержимое массива структурperson_tв форматеИмя Возраст. - В массиве
personsсоздаются три структурыperson_tс разными значениями полейnameиage. - В основной функции программы массив
personsвыводится на экран в неотсортированном виде. - Затем массив
personsсортируется по полюnameс помощью функцииsort_by_name. - После сортировки по полю
nameмассивpersonsвыводится на экран в отсортированном виде. - Затем массив
personsсортируется по полюageс помощью функцииsort_by_age. - После сортировки по полю
ageмассивpersonsвыводится на экран в отсортированном виде. - В конце программы возвращается значение 0, что означает успешное выполнение.