qsort , qsort_r , heapsort , mergesort - sort functions
Lb libc
The
qsort ();
and
heapsort ();
functions sort an array of
Fa nmemb
objects, the initial member of which is pointed to by
Fa base .
The size of each object is specified by
Fa size .
The
mergesort ();
function
behaves similarly, but
requires
that
Fa size
be greater than
``sizeof(void *) / 2''
The contents of the array Fa base are sorted in ascending order according to a comparison function pointed to by Fa compar , which requires two arguments pointing to the objects being compared.
The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.
The
qsort_r ();
function behaves identically to
qsort (,);
except that it takes an additional argument,
Fa thunk ,
which is passed unchanged as the first argument to function pointed to
Fa compar .
This allows the comparison function to access additional
data without using global variables, and thus
qsort_r ();
is suitable for use in functions which must be reentrant.
The algorithms implemented by
qsort (,);
qsort_r (,);
and
heapsort ();
are
not
stable, that is, if two members compare as equal, their order in
the sorted array is undefined.
The
mergesort ();
algorithm is stable.
The
qsort ();
and
qsort_r ();
functions are an implementation of C.A.R.
Hoare's
``quicksort''
algorithm,
a variant of partition-exchange sorting; in particular, see
An D.E. Knuth Ns 's
"Algorithm Q" .
Quicksort
takes O N lg N average time.
This implementation uses median selection to avoid its
O N**2 worst-case behavior.
The
heapsort ();
function is an implementation of
An J.W.J. William Ns 's
``heapsort''
algorithm,
a variant of selection sorting; in particular, see
An D.E. Knuth Ns 's
"Algorithm H" .
Heapsort
takes O N lg N worst-case time.
Its
only
advantage over
qsort ();
is that it uses almost no additional memory; while
qsort ();
does not allocate memory, it is implemented using recursion.
The function
mergesort ();
requires additional memory of size
Fa nmemb *
Fa size
bytes; it should be used only when space is not at a premium.
The
mergesort ();
function
is optimized for data with pre-existing order; its worst case
time is O N lg N; its best case is O N.
Normally,
qsort ();
is faster than
mergesort ();
is faster than
heapsort (.);
Memory availability and pre-existing order in the data can make this
untrue.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |