Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 73

Автор Роббинс ΠΡ€Π½ΠΎΠ»ΡŒΠ΄

$ <b>ch06-sortemp &lt; 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
ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ 68 Π±Π°ΠΉΡ‚ΠΎΠ². ΠŸΡ€ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π΅ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ…Π±Π°ΠΉΡ‚Π½Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ пСрСмСщаСтся Π² 17 Ρ€Π°Π· мСньшС Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π΅ структур.) Для тысяч Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹Ρ… Π² памяти структур Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ°ΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сущСствСнной.

Π—ΠΠœΠ•Π§ΠΠΠ˜Π•. Если Π²Ρ‹ ΡΠ²Π»ΡΠ΅Ρ‚Π΅ΡΡŒ программистом Π‘++, Π·Π½Π°ΠΉΡ‚Π΅!

qsort()
ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ опасной для использования с массивами ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²!
qsort()
осущСствляСт простыС пСрСмСщСния памяти, копируя Π±Π°ΠΉΡ‚Ρ‹. Она ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ конструкциях Π‘++, Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ конструкторы копирования ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
operator=()
. ВмСсто этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ сортировки STL [67] ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΡƒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ.

6.2.1.2. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: сортировка содСрТимого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 5.3 Β«Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²Β» ΠΌΡ‹ продСмонстрировали, ΠΊΠ°ΠΊ элСмСнты ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π² физичСском порядкС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Π΅Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ содСрТимоС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° отсортированным ΠΊΠ°ΠΊΠΈΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ измСнСния. Π₯отя ΠΈ Π½Π΅ стандартизованныС POSIX, нСсколько ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ это, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ

qsort()
Π² качСствС Π»Π΅ΠΆΠ°Ρ‰Π΅Π³ΠΎ Π² основС ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π°Π³Π΅Π½Ρ‚Π°:

#include &lt;dirent.h&gt; /* ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ */

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()
Π±Ρ‹Π»ΠΈ сдСланы доступными Π² 4.2 BSD ΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ [68],
versionsort()
являСтся Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ GNU.

scandir()
Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΄Π°Π½ΠΎ Π²
dir
, создаСт с использованиСм
malloc()
массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ
struct dirent
ΠΈ устанавливаСт
*namelist
, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ этого массива. Как массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, Ρ‚Π°ΠΊ ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ структуры
struct dirent
Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ
malloc()
; Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ
free()
, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти.

Для Π²Ρ‹Π±ΠΎΡ€Π° Π½ΡƒΠΆΠ½Ρ‹Ρ… элСмСнтов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

select
. Когда это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ
NULL
, всС Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ элСмСнты ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ массив. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС
(*select)()
вызываСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта, ΠΈ Ρ‚Π΅ элСмСнты, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ (истинноС) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π² массив.

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ compare сравниваСт Π΄Π²Π° элСмСнта ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. Он пСрСдаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

qsort()
для использования ΠΏΡ€ΠΈ сортировкС.

alphasort()
лСксикографичСски сравниваСт ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ². Она ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для сравнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
strcoll()
.
strcoll()
ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π°
strcmp()
, Π½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ связанныС с мСстной спСцификой ΠΏΡ€Π°Π²ΠΈΠ»Π° сортировки (см. Ρ€Π°Π·Π΄Π΅Π» 13.4 «НС ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ это для мСня ΠΏΠΎ Π±ΡƒΠΊΠ²Π°ΠΌ?Β»).

versionsort()
являСтся Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ GNU, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для сравнСния ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ GNU
strverscmp()
(см. strverscmp(3).) ΠšΠΎΡ€ΠΎΡ‡Π΅ говоря, эта функция ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ соглашСния ΠΏΠΎ вСрсиям ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ сравниваСт ΠΈΡ… ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Π’

ch06-sortdir.c
ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, похоТая Π½Π°
ch04-catdir.c
. Однако, ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для Ρ€Π°Π±ΠΎΡ‚Ρ‹
scandir()
ΠΈ
alphasort()
.

1Β  /* ch06-sortdir.c --- ДСмонстрируСт scandir(), alphasort(). */

2

3  #include &lt;stdio.h&gt; /* для printf() etc. */

4  #include &lt;errno.h&gt; /* для errno */

5Β  #include &lt;sys/types.h&gt; /* для систСмных Ρ‚ΠΈΠΏΠΎΠ² */

6 Β #include &lt;dirent.h&gt; /* для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² */

7

8Β  char *myname;

9Β  int process(const char *dir);

10

11 /* main --- ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° */

12