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