1 .\" Copyright (c) 1990, 1991, 1993
2 .\" The Regents of the University of California. All rights reserved.
4 .\" This code is derived from software contributed to Berkeley by
5 .\" the American National Standards Committee X3, on Information
6 .\" Processing Systems.
8 .\" Redistribution and use in source and binary forms, with or without
9 .\" modification, are permitted provided that the following conditions
11 .\" 1. Redistributions of source code must retain the above copyright
12 .\" notice, this list of conditions and the following disclaimer.
13 .\" 2. Redistributions in binary form must reproduce the above copyright
14 .\" notice, this list of conditions and the following disclaimer in the
15 .\" documentation and/or other materials provided with the distribution.
16 .\" 3. Neither the name of the University nor the names of its contributors
17 .\" may be used to endorse or promote products derived from this software
18 .\" without specific prior written permission.
20 .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53 .Fa "int \*[lp]*compar\*[rp]\*[lp]const void *, const void *\*[rp]"
60 .Fa "int \*[lp]^compar\*[rp]\*[lp]const void *, const void *\*[rp]"
67 .Fa "int \*[lp]*compar\*[rp]\*[lp]const void *, const void *, void *\*[rp]"
75 .Fa "int \*[lp]*compar\*[rp]\*[lp]const void *, const void *\*[rp]"
82 .Fa "int \*[lp]^compar\*[rp]\*[lp]const void *, const void *\*[rp]"
89 .Fa "int \*[lp]*compar\*[rp]\*[lp]const void *, const void *\*[rp]"
96 .Fa "int \*[lp]^compar\*[rp]\*[lp]const void *, const void *\*[rp]"
98 .Fd #define __STDC_WANT_LIB_EXT1__ 1
104 .Fa "int \*[lp]*compar\*[rp]\*[lp]const void *, const void *, void *\*[rp]"
110 function is a modified partition-exchange sort, or quicksort.
113 function is a modified selection sort.
116 function is a modified merge sort with exponential search
117 intended for sorting data with pre-existing order.
123 functions sort an array of
125 objects, the initial member of which is pointed to by
127 The size of each object is specified by
132 behaves similarly, but
137 .Dq "sizeof(void *) / 2" .
139 The contents of the array
141 are sorted in ascending order according to
142 a comparison function pointed to by
144 which requires two arguments pointing to the objects being
147 The comparison function must return an integer less than, equal to, or
148 greater than zero if the first argument is considered to be respectively
149 less than, equal to, or greater than the second.
153 function behaves identically to
155 except that it takes an additional argument,
157 which is passed unchanged as the last argument to function pointed to
159 This allows the comparison function to access additional
160 data without using global variables, and thus
162 is suitable for use in functions which must be reentrant.
165 function behaves identically to
167 except that it takes a block, rather than a function pointer.
169 The algorithms implemented by
176 stable, that is, if two members compare as equal, their order in
177 the sorted array is undefined.
180 function behaves identically to
182 except that it takes a block, rather than a function pointer.
188 function behaves identically to
190 except that it takes a block, rather than a function pointer.
196 functions are an implementation of C.A.R.
200 a variant of partition-exchange sorting; in particular, see
204 takes O N lg N average time.
205 This implementation uses median selection to avoid its
206 O N**2 worst-case behavior.
210 function is an implementation of
211 .An "J.W.J. William" Ns 's
214 a variant of selection sorting; in particular, see
215 .An "D.E. Knuth" Ns 's
218 takes O N lg N worst-case time.
223 is that it uses almost no additional memory; while
225 does not allocate memory, it is implemented using recursion.
229 requires additional memory of size
232 bytes; it should be used only when space is not at a premium.
236 is optimized for data with pre-existing order; its worst case
237 time is O N lg N; its best case is O N.
245 Memory availability and pre-existing order in the data can make this
250 function behaves the same as
251 .Fn qsort_r , except that:
254 The order of arguments is different
256 The order of arguments to
274 is zero, then the runtime-constraint handler is called, and
277 Note that the handler is called before
279 returns the error, and the handler function might not return.
290 function returns zero on success, non-zero on error.
292 .Rv -std heapsort mergesort
294 A sample program that sorts an array of
296 values in place using
298 and then prints the sorted array to standard output is:
304 * Custom comparison function that compares 'int' values through pointers
305 * passed by qsort(3).
308 int_compare(const void *p1, const void *p2)
310 int left = *(const int *)p1;
311 int right = *(const int *)p2;
313 return ((left > right) - (left < right));
317 * Sort an array of 'int' values and print it to standard output.
322 int int_array[] = { 4, 5, 9, 3, 0, 1, 7, 2, 8, 6 };
323 size_t array_size = sizeof(int_array) / sizeof(int_array[0]);
326 qsort(&int_array, array_size, sizeof(int_array[0]), int_compare);
327 for (k = 0; k < array_size; k++)
328 printf(" %d", int_array[k]);
330 return (EXIT_SUCCESS);
334 The order of arguments for the comparison function used with
336 is different from the one used by
338 and the GNU libc implementation of
340 When porting software written for GNU libc, it is usually possible
345 to work around this problem.
352 and may not be portable to other standards-conforming platforms.
356 did not permit the comparison routine itself to call
358 This is no longer true.
364 functions succeed unless:
369 argument is zero, or,
375 .Dq "sizeof(void *) / 2" .
382 were unable to allocate memory.
391 .%J "The Computer Journal"
399 .%J "Communications of the ACM"
406 .%B "The Art of Computer Programming"
408 .%T "Sorting and Searching"
409 .%P pp. 114-123, 145-149
413 .%T "Optimistic Sorting and Information Theoretic Complexity"
414 .%J "Fourth Annual ACM-SIAM Symposium on Discrete Algorithms"
420 .%T "Engineering a Sort Function"
421 .%J "Software--Practice and Experience"
437 The variants of these functions that take blocks as arguments first appeared in
439 This implementation was created by David Chisnall.
445 was updated to match POSIX.