Методы сортировки в структуре(си) - 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;
}

Объяснение кода листинга программы

  1. Структура person_t объявляет переменные name и age типа char* и int соответственно.
  2. Функция swap_persons меняет местами указатели на структуры person_t в a и b.
  3. Функция min_name находит минимальный элемент в массиве структур person_t по полю name и возвращает указатель на этот элемент.
  4. Функция min_age находит минимальный элемент в массиве структур person_t по полю age и возвращает указатель на этот элемент.
  5. Функция sort_by_name сортирует массив структур person_t по полю name.
  6. Функция sort_by_age сортирует массив структур person_t по полю age.
  7. Функция dump выводит на экран содержимое массива структур person_t в формате Имя               Возраст.
  8. В массиве persons создаются три структуры person_t с разными значениями полей name и age.
  9. В основной функции программы массив persons выводится на экран в неотсортированном виде.
  10. Затем массив persons сортируется по полю name с помощью функции sort_by_name.
  11. После сортировки по полю name массив persons выводится на экран в отсортированном виде.
  12. Затем массив persons сортируется по полю age с помощью функции sort_by_age.
  13. После сортировки по полю age массив persons выводится на экран в отсортированном виде.
  14. В конце программы возвращается значение 0, что означает успешное выполнение.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.667 из 5
Похожие ответы