Методы сортировки в структуре(си) - 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, что означает успешное выполнение.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д