Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
$ <b>ch06-sortemp < presdata.txt</b>Sorted by name: Bush George 41 Fri Jan 20 13:00:00 1989 Bush George 43 Sat Jan 20 13:00:00 2001 Carter James 39 Thu Jan 20 13:00:00 1977 Clinton William 42 Wed Jan 20 13:00:00 1993 Reagan Ronald 40 Tue Jan 20 13:00:00 1981 Sorted by seniority: Carter James 39 Thu Jan 20 13:00:00 1977 Reagan Ronald 40 Tue Jan 20 13:00:00 1981 Bush George 41 Fri Jan 20 13:00:00 1989 Clinton William 42 Wed Jan 20 13:00:00 1993 Bush George 43 Sat Jan 20 13:00:00 2001(Мы использовали 1 час пополудни как приблизительное время, когда все президенты начали работать.) [66]
Стоит заметить одну вещь:
qsort()qsort()Платой за это является дополнительная память для размещения указателей и модификация функций сравнения для дополнительного перенаправления указателей при сравнении структур. Полученной выгодой может стать значительное ускорение работы, поскольку на каждом шаге перемещается лишь четырех- или восьмибайтный указатель вместо большой структуры. (Наша
struct employeeЗАМЕЧАНИЕ. Если вы являетесь программистом С++, знайте!
qsort()qsort()operator=()6.2.1.2. Пример: сортировка содержимого каталога
В разделе 5.3 «Чтение каталогов» мы продемонстрировали, как элементы каталогов возвращаются в физическом порядке каталога. В большинстве случаев гораздо полезнее иметь содержимое каталога отсортированным каким-нибудь образом, например, по имени или по времени изменения. Хотя и не стандартизованные POSIX, несколько процедур упрощают это, используя
qsort()#include <dirent.h> /* Обычный */int scandir(const char *dir, struct dirent ***namelist, int (*select)(const struct dirent*), int (*compare)(const struct dirent **, const struct dirent **));int alphasort(const void *a, const void *b);int versionsort(const void *a, const void *b); /* GLIBC */Функции
scandir()alphasort()versionsort()scandir()dirmalloc()struct dirent*nameliststruct direntmalloc()free()Для выбора нужных элементов используйте указатель функции
selectNULL(*select)()Указатель функции compare сравнивает два элемента каталога. Он передается функции
qsort()alphasort()strcoll()strcoll()strcmp()versionsort()strverscmp()В
ch06-sortdir.cch04-catdir.cscandir()alphasort()1 /* ch06-sortdir.c --- Демонстрирует scandir(), alphasort(). */23 #include <stdio.h> /* для printf() etc. */4 #include <errno.h> /* для errno */5 #include <sys/types.h> /* для системных типов */6 #include <dirent.h> /* для функций каталогов */78 char *myname;9 int process(const char *dir);1011 /* main --- перечислить аргументы каталога */12