xref: /dragonfly/lib/libc/stdlib/qsort.3 (revision 984263bc)
1.\" Copyright (c) 1990, 1991, 1993
2.\"	The Regents of the University of California.  All rights reserved.
3.\"
4.\" This code is derived from software contributed to Berkeley by
5.\" the American National Standards Committee X3, on Information
6.\" Processing Systems.
7.\"
8.\" Redistribution and use in source and binary forms, with or without
9.\" modification, are permitted provided that the following conditions
10.\" are met:
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. All advertising materials mentioning features or use of this software
17.\"    must display the following acknowledgement:
18.\"	This product includes software developed by the University of
19.\"	California, Berkeley and its contributors.
20.\" 4. Neither the name of the University nor the names of its contributors
21.\"    may be used to endorse or promote products derived from this software
22.\"    without specific prior written permission.
23.\"
24.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34.\" SUCH DAMAGE.
35.\"
36.\"     @(#)qsort.3	8.1 (Berkeley) 6/4/93
37.\" $FreeBSD: src/lib/libc/stdlib/qsort.3,v 1.4.2.5 2001/12/14 18:33:58 ru Exp $
38.\"
39.Dd June 4, 1993
40.Dt QSORT 3
41.Os
42.Sh NAME
43.Nm qsort , heapsort , mergesort
44.Nd sort functions
45.Sh LIBRARY
46.Lb libc
47.Sh SYNOPSIS
48.In stdlib.h
49.Ft void
50.Fn qsort "void *base" "size_t nmemb" "size_t size" "int (*compar)(const void *, const void *)"
51.Ft int
52.Fn heapsort "void *base" "size_t nmemb" "size_t size" "int (*compar)(const void *, const void *)"
53.Ft int
54.Fn mergesort "void *base" "size_t nmemb" "size_t size" "int (*compar)(const void *, const void *)"
55.Sh DESCRIPTION
56The
57.Fn qsort
58function is a modified partition-exchange sort, or quicksort.
59The
60.Fn heapsort
61function is a modified selection sort.
62The
63.Fn mergesort
64function is a modified merge sort with exponential search
65intended for sorting data with pre-existing order.
66.Pp
67The
68.Fn qsort
69and
70.Fn heapsort
71functions sort an array of
72.Fa nmemb
73objects, the initial member of which is pointed to by
74.Fa base .
75The size of each object is specified by
76.Fa size .
77.Fn Mergesort
78behaves similarly, but
79.Em requires
80that
81.Fa size
82be greater than
83.Dq "sizeof(void *) / 2" .
84.Pp
85The contents of the array
86.Fa base
87are sorted in ascending order according to
88a comparison function pointed to by
89.Fa compar ,
90which requires two arguments pointing to the objects being
91compared.
92.Pp
93The comparison function must return an integer less than, equal to, or
94greater than zero if the first argument is considered to be respectively
95less than, equal to, or greater than the second.
96.Pp
97The functions
98.Fn qsort
99and
100.Fn heapsort
101are
102.Em not
103stable, that is, if two members compare as equal, their order in
104the sorted array is undefined.
105The function
106.Fn mergesort
107is stable.
108.Pp
109The
110.Fn qsort
111function is an implementation of C.A.R. Hoare's ``quicksort'' algorithm,
112a variant of partition-exchange sorting; in particular, see D.E. Knuth's
113Algorithm Q.
114.Fn Qsort
115takes O N lg N average time.
116This implementation uses median selection to avoid its
117O N**2 worst-case behavior.
118.Pp
119The
120.Fn heapsort
121function is an implementation of J.W.J. William's ``heapsort'' algorithm,
122a variant of selection sorting; in particular, see D.E. Knuth's Algorithm H.
123.Fn Heapsort
124takes O N lg N worst-case time.
125Its
126.Em only
127advantage over
128.Fn qsort
129is that it uses almost no additional memory; while
130.Fn qsort
131does not allocate memory, it is implemented using recursion.
132.Pp
133The function
134.Fn mergesort
135requires additional memory of size
136.Fa nmemb *
137.Fa size
138bytes; it should be used only when space is not at a premium.
139.Fn Mergesort
140is optimized for data with pre-existing order; its worst case
141time is O N lg N; its best case is O N.
142.Pp
143Normally,
144.Fn qsort
145is faster than
146.Fn mergesort
147is faster than
148.Fn heapsort .
149Memory availability and pre-existing order in the data can make this
150untrue.
151.Sh RETURN VALUES
152The
153.Fn qsort
154function
155returns no value.
156.Pp
157.Rv -std heapsort mergesort
158.Sh ERRORS
159The
160.Fn heapsort
161and
162.Fn mergesort
163functions succeed unless:
164.Bl -tag -width Er
165.It Bq Er EINVAL
166The
167.Fa size
168argument is zero, or,
169the
170.Fa size
171argument to
172.Fn mergesort
173is less than
174.Dq "sizeof(void *) / 2" .
175.It Bq Er ENOMEM
176.Fn Heapsort
177or
178.Fn mergesort
179were unable to allocate memory.
180.El
181.Sh COMPATIBILITY
182Previous versions of
183.Fn qsort
184did not permit the comparison routine itself to call
185.Fn qsort 3 .
186This is no longer true.
187.Sh SEE ALSO
188.Xr sort 1 ,
189.Xr radixsort 3
190.Rs
191.%A Hoare, C.A.R.
192.%D 1962
193.%T "Quicksort"
194.%J "The Computer Journal"
195.%V 5:1
196.%P pp. 10-15
197.Re
198.Rs
199.%A Williams, J.W.J
200.%D 1964
201.%T "Heapsort"
202.%J "Communications of the ACM"
203.%V 7:1
204.%P pp. 347-348
205.Re
206.Rs
207.%A Knuth, D.E.
208.%D 1968
209.%B "The Art of Computer Programming"
210.%V Vol. 3
211.%T "Sorting and Searching"
212.%P pp. 114-123, 145-149
213.Re
214.Rs
215.%A Mcilroy, P.M.
216.%T "Optimistic Sorting and Information Theoretic Complexity"
217.%J "Fourth Annual ACM-SIAM Symposium on Discrete Algorithms"
218.%V January 1992
219.Re
220.Rs
221.%A Bentley, J.L.
222.%T "Engineering a Sort Function"
223.%J "bentley@research.att.com"
224.%V January 1992
225.Re
226.Sh STANDARDS
227The
228.Fn qsort
229function
230conforms to
231.St -isoC .
232