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.18 2015/01/29 01:46:31 schwarze Exp $ 33.\" 34.Dd $Mdocdate: January 29 2015 $ 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 150.Rv -std heapsort mergesort 151.Sh ERRORS 152The 153.Fn heapsort 154and 155.Fn mergesort 156functions succeed unless: 157.Bl -tag -width Er 158.It Bq Er EINVAL 159The 160.Fa size 161argument is zero, or the 162.Fa size 163argument to 164.Fn mergesort 165is less than 166.Dq "sizeof(void *) / 2" . 167.It Bq Er ENOMEM 168.Fn heapsort 169or 170.Fn mergesort 171were unable to allocate memory. 172.El 173.Sh SEE ALSO 174.Xr sort 1 , 175.Xr radixsort 3 176.Rs 177.%A Hoare, C.A.R. 178.%D 1962 179.%T "Quicksort" 180.%J "The Computer Journal" 181.%V 5:1 182.%P pp. 10-15 183.Re 184.Rs 185.%A Williams, J.W.J 186.%D 1964 187.%T "Heapsort" 188.%J "Communications of the ACM" 189.%V 7:1 190.%P pp. 347\-348 191.Re 192.Rs 193.%A Knuth, D.E. 194.%D 1968 195.%B "The Art of Computer Programming" 196.%V Vol. 3 197.%T "Sorting and Searching" 198.%P pp. 114\-123, 145\-149 199.Re 200.Rs 201.%A McIlroy, P.M. 202.%T "Optimistic Sorting and Information Theoretic Complexity" 203.%J "Fourth Annual ACM-SIAM Symposium on Discrete Algorithms" 204.%P pp. 467\-464 205.%D January 1993 206.Re 207.Rs 208.%A Bentley, J.L. 209.%A McIlroy, M.D. 210.%T "Engineering a Sort Function" 211.%J "Software \- Practice and Experience" 212.%V Vol. 23(11) 213.%P pp. 1249\-1265 214.%D November 1993 215.Re 216.Sh STANDARDS 217Previous versions of 218.Fn qsort 219did not permit the comparison routine itself to call 220.Fn qsort . 221This is no longer true. 222.Pp 223The 224.Fn qsort 225function conforms to 226.St -ansiC . 227.Sh HISTORY 228A 229.Fn qsort 230function first appeared in 231.At v3 . 232