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$ 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.Fd #include <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 157Upon successful completion, 158.Fn heapsort 159and 160.Fn mergesort 161return 0. 162Otherwise, they return \-1 and the global variable 163.Va errno 164is set to indicate the error. 165.Sh ERRORS 166The 167.Fn heapsort 168and 169.Fn mergesort 170functions succeed unless: 171.Bl -tag -width Er 172.It Bq Er EINVAL 173The 174.Fa size 175argument is zero, or, 176the 177.Fa size 178argument to 179.Fn mergesort 180is less than 181.Dq "sizeof(void *) / 2" . 182.It Bq Er ENOMEM 183.Fn Heapsort 184or 185.Fn mergesort 186were unable to allocate memory. 187.El 188.Sh COMPATIBILITY 189Previous versions of 190.Fn qsort 191did not permit the comparison routine itself to call 192.Fn qsort 3 . 193This is no longer true. 194.Sh SEE ALSO 195.Xr sort 1 , 196.Xr radixsort 3 197.Rs 198.%A Hoare, C.A.R. 199.%D 1962 200.%T "Quicksort" 201.%J "The Computer Journal" 202.%V 5:1 203.%P pp. 10-15 204.Re 205.Rs 206.%A Williams, J.W.J 207.%D 1964 208.%T "Heapsort" 209.%J "Communications of the ACM" 210.%V 7:1 211.%P pp. 347-348 212.Re 213.Rs 214.%A Knuth, D.E. 215.%D 1968 216.%B "The Art of Computer Programming" 217.%V Vol. 3 218.%T "Sorting and Searching" 219.%P pp. 114-123, 145-149 220.Re 221.Rs 222.%A Mcilroy, P.M. 223.%T "Optimistic Sorting and Information Theoretic Complexity" 224.%J "Fourth Annual ACM-SIAM Symposium on Discrete Algorithms" 225.%V January 1992 226.Re 227.Rs 228.%A Bentley, J.L. 229.%T "Engineering a Sort Function" 230.%J "bentley@research.att.com" 231.%V January 1992 232.Re 233.Sh STANDARDS 234The 235.Fn qsort 236function 237conforms to 238.St -isoC . 239