Язык Си в примерах/Сортировка на основе qsort
Материал из Викиучебника
Язык Си в примерах
- Компиляция программ
- Простейшая программа «Hello World»
- Учимся складывать
- Максимум
- Таблица умножения
- ASCII коды символов
- Верхний регистр
- Скобочки
- Факториал
- Степень числа
- Треугольник Паскаля
- Корень уравнения
- Система счисления
- Сортировка
- Библиотека complex
- Сортировка на основе qsort
- RPN калькулятор
- RPN калькулятор на Bison
- Простая грамматика
- Задача «Расчёт сопротивления схемы»
- Простая реализация конечного автомата
- Использование аргументов командной строки
- Чтение и печать без использования stdio
[править] Пример использования функции qsort из stdlib
Вход: В первой строчке дано N, а затем следует N строчек вида ИМЯ ТЕЛЕФОН
Выход: Выведите телефонный справочник в алфавитном порядке и в порядке возрастания телефонных номеров.
#include <stdio.h> #include <stdlib.h> typedef struct person_t { char * name; int phone; } person_t; int namecmp(const void* a, const void* b); int phonecmp(const void* a, const void* b); main() { char name[1000]; person_t *base; int n, i, phone; scanf("%d", &n); base = malloc(n * sizeof(person_t)); /* Считываем телефонную базу */ for(i = 0 ; i < n ; i++) { scanf("%s%d", name, &phone); /* Выделяем память под массив base[i].name, учитывая символ конца строки */ base[i].name = malloc((strlen(name)+1) * sizeof(char)); strcpy(base[i].name, name); base[i].phone = phone; } qsort(base, n, sizeof(person_t), namecmp); /* Напечатаем в алфавитном порядке */ for(i = 0 ; i < n ; i++) { printf("%20s %d\n", base[i].name, base[i].phone); } qsort(base, n, sizeof(person_t), phonecmp); /* Напечатаем в порядке возрастания номеров*/ for(i = 0 ; i < n ; i++) { printf("%20s %d\n", base[i].name, base[i].phone); } /* Освобождаем выделенную память */ for(i = 0 ; i < n ; i++) { free(base[i].name); } free(base); return 0; } int namecmp(const void* a, const void* b) { person_t *pa = a; person_t *pb = b; return strcmp(pa->name, pb->name); } int phonecmp(const void* a, const void* b) { person_t *pa = a; person_t *pb = b; return pa->phone - pb->phone; }