xref: /original-bsd/lib/libc/stdlib/radixsort.3 (revision f737e041)
1.\" Copyright (c) 1990, 1991, 1993
2.\"	The Regents of the University of California.  All rights reserved.
3.\"
4.\" %sccs.include.redist.man%
5.\"
6.\"     @(#)radixsort.3	8.2 (Berkeley) 01/27/94
7.\"
8.Dd
9.Dt RADIXSORT 3
10.Os
11.Sh NAME
12.Nm radixsort
13.Nd radix sort
14.Sh SYNOPSIS
15.Fd #include <limits.h>
16.Fd #include <stdlib.h>
17.Ft int
18.Fn radixsort "u_char **base" "int nmemb" "u_char *table" "u_int endbyte"
19.Ft int
20.Fn sradixsort "u_char **base" "int nmemb" "u_char *table" "u_int endbyte"
21.Sh DESCRIPTION
22The
23.Fn radixsort
24and
25.Fn sradixsort
26functions
27are implementations of radix sort.
28.Pp
29These functions sort an array of pointers to byte strings, the initial
30member of which is referenced by
31.Fa base .
32The byte strings may contain any values; the end of each string
33is denoted by the user-specified value
34.Fa endbyte .
35.Pp
36Applications may specify a sort order by providing the
37.Fa table
38argument.
39If
40.Pf non- Dv NULL ,
41.Fa table
42must reference an array of
43.Dv UCHAR_MAX
44+ 1 bytes which contains the sort
45weight of each possible byte value.
46The end-of-string byte must have a sort weight of 0 or 255
47(for sorting in reverse order).
48More than one byte may have the same sort weight.
49The
50.Fa table
51argument
52is useful for applications which wish to sort different characters
53equally, for example, providing a table with the same weights
54for A-Z as for a-z will result in a case-insensitive sort.
55If
56.Fa table
57is NULL, the contents of the array are sorted in ascending order
58according to the
59.Tn ASCII
60order of the byte strings they reference and
61.Fa endbyte
62has a sorting weight of 0.
63.Pp
64The
65.Fn sradixsort
66function is stable, that is, if two elements compare as equal, their
67order in the sorted array is unchanged.
68The
69.Fn sradixsort
70function uses additional memory sufficient to hold
71.Fa nmemb
72pointers.
73.Pp
74The
75.Fn radixsort
76function is not stable, but uses no additional memory.
77.Pp
78These functions are variants of most-significant-byte radix sorting; in
79particular, see D.E. Knuth's Algorithm R and section 5.2.5, exercise 10.
80They take linear time relative to the number of bytes in the strings.
81.Sh RETURN VALUES
82Upon successful completion 0 is returned.
83Otherwise, \-1 is returned and the global variable
84.Va errno
85is set to indicate the error.
86.Sh ERRORS
87.Bl -tag -width Er
88.It Bq Er EINVAL
89The value of the
90.Fa endbyte
91element of
92.Fa table
93is not 0 or 255.
94.El
95.Pp
96Additionally, the
97.Fn sradixsort
98function
99may fail and set
100.Va errno
101for any of the errors specified for the library routine
102.Xr malloc 3 .
103.Sh SEE ALSO
104.Xr sort 1 ,
105.Xr qsort 3
106.Pp
107.Rs
108.%A Knuth, D.E.
109.%D 1968
110.%B "The Art of Computer Programming"
111.%T "Sorting and Searching"
112.%V Vol. 3
113.%P pp. 170-178
114.Re
115.Rs
116.%A Paige, R.
117.%D 1987
118.%T "Three Partition Refinement Algorithms"
119.%J "SIAM J. Comput."
120.%V Vol. 16
121.%N No. 6
122.Re
123.Rs
124.%A McIlroy, P.
125.%D 1993
126.%B "Engineering Radix Sort"
127.%T "Computing Systems"
128.%V Vol. 6:1
129.%P pp. 5-27
130.Re
131.Sh HISTORY
132The
133.Fn radixsort
134function first appeared in 4.4BSD.
135