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. 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. 19.\" 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 30.\" SUCH DAMAGE. 31.\" 32.\" $OpenBSD: qsort.3,v 1.17 2013/07/17 05:42:11 schwarze Exp $ 33.\" 34.Dd $Mdocdate: July 17 2013 $ 35.Dt QSORT 3 36.Os 37.Sh NAME 38.Nm qsort , 39.Nm heapsort , 40.Nm mergesort 41.Nd sort functions 42.Sh SYNOPSIS 43.In stdlib.h 44.Ft void 45.Fn qsort "void *base" "size_t nmemb" "size_t size" "int (*compar)(const void *, const void *)" 46.Ft int 47.Fn heapsort "void *base" "size_t nmemb" "size_t size" "int (*compar)(const void *, const void *)" 48.Ft int 49.Fn mergesort "void *base" "size_t nmemb" "size_t size" "int (*compar)(const void *, const void *)" 50.Sh DESCRIPTION 51The 52.Fn qsort 53function is a modified partition-exchange sort, or quicksort. 54The 55.Fn heapsort 56function is a modified selection sort. 57The 58.Fn mergesort 59function is a modified merge sort with exponential search 60intended for sorting data with pre-existing order. 61.Pp 62The 63.Fn qsort 64and 65.Fn heapsort 66functions sort an array of 67.Fa nmemb 68objects, the initial member of which is pointed to by 69.Fa base . 70The size of each object is specified by 71.Fa size . 72.Fn mergesort 73behaves similarly, but 74.Em requires 75that 76.Fa size 77be greater than 78.Dq "sizeof(void *) / 2" . 79.Pp 80The contents of the array 81.Fa base 82are sorted in ascending order according to 83a comparison function pointed to by 84.Fa compar , 85which requires two arguments pointing to the objects being 86compared. 87.Pp 88The comparison function must return an integer less than, equal to, or 89greater than zero if the first argument is considered to be respectively 90less than, equal to, or greater than the second. 91.Pp 92The functions 93.Fn qsort 94and 95.Fn heapsort 96are 97.Em not 98stable, that is, if two members compare as equal, their order in 99the sorted array is undefined. 100The function 101.Fn mergesort 102is stable. 103.Pp 104The 105.Fn qsort 106function is an implementation of C.A.R. Hoare's 107.Dq quicksort 108algorithm, 109a variant of partition-exchange sorting; in particular, see D.E. Knuth's 110Algorithm Q. 111.Fn qsort 112takes O N lg N average time. 113This implementation uses median selection to avoid its 114O N**2 worst-case behavior. 115.Pp 116The 117.Fn heapsort 118function is an implementation of J.W.J. William's 119.Dq heapsort 120algorithm, 121a variant of selection sorting; in particular, see D.E. Knuth's Algorithm H. 122.Fn heapsort 123takes O N lg N worst-case time. 124This implementation of 125.Fn heapsort 126is implemented without recursive function calls. 127.Pp 128The function 129.Fn mergesort 130requires additional memory of size 131.Fa nmemb * 132.Fa size 133bytes; it should be used only when space is not at a premium. 134.Fn mergesort 135is optimized for data with pre-existing order; its worst case 136time is O N lg N; its best case is O N. 137.Pp 138Normally, 139.Fn qsort 140is faster than 141.Fn mergesort , 142which is faster than 143.Fn heapsort . 144Memory availability and pre-existing order in the data can make this untrue. 145.Sh RETURN VALUES 146The 147.Fn qsort 148function returns no value. 149.Pp 150Upon successful completion, 151.Fn heapsort 152and 153.Fn mergesort 154return 0. 155Otherwise, they return \-1 and the global variable 156.Va errno 157is set to indicate the error. 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 the 169.Fa size 170argument to 171.Fn mergesort 172is less than 173.Dq "sizeof(void *) / 2" . 174.It Bq Er ENOMEM 175.Fn heapsort 176or 177.Fn mergesort 178were unable to allocate memory. 179.El 180.Sh SEE ALSO 181.Xr sort 1 , 182.Xr radixsort 3 183.Rs 184.%A Hoare, C.A.R. 185.%D 1962 186.%T "Quicksort" 187.%J "The Computer Journal" 188.%V 5:1 189.%P pp. 10-15 190.Re 191.Rs 192.%A Williams, J.W.J 193.%D 1964 194.%T "Heapsort" 195.%J "Communications of the ACM" 196.%V 7:1 197.%P pp. 347\-348 198.Re 199.Rs 200.%A Knuth, D.E. 201.%D 1968 202.%B "The Art of Computer Programming" 203.%V Vol. 3 204.%T "Sorting and Searching" 205.%P pp. 114\-123, 145\-149 206.Re 207.Rs 208.%A McIlroy, P.M. 209.%T "Optimistic Sorting and Information Theoretic Complexity" 210.%J "Fourth Annual ACM-SIAM Symposium on Discrete Algorithms" 211.%P pp. 467\-464 212.%D January 1993 213.Re 214.Rs 215.%A Bentley, J.L. 216.%A McIlroy, M.D. 217.%T "Engineering a Sort Function" 218.%J "Software \- Practice and Experience" 219.%V Vol. 23(11) 220.%P pp. 1249\-1265 221.%D November 1993 222.Re 223.Sh STANDARDS 224Previous versions of 225.Fn qsort 226did not permit the comparison routine itself to call 227.Fn qsort . 228This is no longer true. 229.Pp 230The 231.Fn qsort 232function conforms to 233.St -ansiC . 234.Sh HISTORY 235A 236.Fn qsort 237function first appeared in 238.At v3 . 239