Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / devtools / v9 / man / man3 / sort.3
CommitLineData
920dae64
AT
1.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.32
2.\"
3.\" Standard preamble:
4.\" ========================================================================
5.de Sh \" Subsection heading
6.br
7.if t .Sp
8.ne 5
9.PP
10\fB\\$1\fR
11.PP
12..
13.de Sp \" Vertical space (when we can't use .PP)
14.if t .sp .5v
15.if n .sp
16..
17.de Vb \" Begin verbatim text
18.ft CW
19.nf
20.ne \\$1
21..
22.de Ve \" End verbatim text
23.ft R
24.fi
25..
26.\" Set up some character translations and predefined strings. \*(-- will
27.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
28.\" double quote, and \*(R" will give a right double quote. | will give a
29.\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used to
30.\" do unbreakable dashes and therefore won't be available. \*(C` and \*(C'
31.\" expand to `' in nroff, nothing in troff, for use with C<>.
32.tr \(*W-|\(bv\*(Tr
33.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
34.ie n \{\
35. ds -- \(*W-
36. ds PI pi
37. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
38. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
39. ds L" ""
40. ds R" ""
41. ds C` ""
42. ds C' ""
43'br\}
44.el\{\
45. ds -- \|\(em\|
46. ds PI \(*p
47. ds L" ``
48. ds R" ''
49'br\}
50.\"
51.\" If the F register is turned on, we'll generate index entries on stderr for
52.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
53.\" entries marked with X<> in POD. Of course, you'll have to process the
54.\" output yourself in some meaningful fashion.
55.if \nF \{\
56. de IX
57. tm Index:\\$1\t\\n%\t"\\$2"
58..
59. nr % 0
60. rr F
61.\}
62.\"
63.\" For nroff, turn off justification. Always turn off hyphenation; it makes
64.\" way too many mistakes in technical documents.
65.hy 0
66.if n .na
67.\"
68.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
69.\" Fear. Run. Save yourself. No user-serviceable parts.
70. \" fudge factors for nroff and troff
71.if n \{\
72. ds #H 0
73. ds #V .8m
74. ds #F .3m
75. ds #[ \f1
76. ds #] \fP
77.\}
78.if t \{\
79. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
80. ds #V .6m
81. ds #F 0
82. ds #[ \&
83. ds #] \&
84.\}
85. \" simple accents for nroff and troff
86.if n \{\
87. ds ' \&
88. ds ` \&
89. ds ^ \&
90. ds , \&
91. ds ~ ~
92. ds /
93.\}
94.if t \{\
95. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
96. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
97. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
98. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
99. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
100. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
101.\}
102. \" troff and (daisy-wheel) nroff accents
103.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
104.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
105.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
106.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
107.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
108.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
109.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
110.ds ae a\h'-(\w'a'u*4/10)'e
111.ds Ae A\h'-(\w'A'u*4/10)'E
112. \" corrections for vroff
113.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
114.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
115. \" for low resolution devices (crt and lpr)
116.if \n(.H>23 .if \n(.V>19 \
117\{\
118. ds : e
119. ds 8 ss
120. ds o a
121. ds d- d\h'-1'\(ga
122. ds D- D\h'-1'\(hy
123. ds th \o'bp'
124. ds Th \o'LP'
125. ds ae ae
126. ds Ae AE
127.\}
128.rm #[ #] #H #V #F C
129.\" ========================================================================
130.\"
131.IX Title "sort 3"
132.TH sort 3 "2001-09-21" "perl v5.8.8" "Perl Programmers Reference Guide"
133.SH "NAME"
134sort \- perl pragma to control sort() behaviour
135.SH "SYNOPSIS"
136.IX Header "SYNOPSIS"
137.Vb 5
138\& use sort 'stable'; # guarantee stability
139\& use sort '_quicksort'; # use a quicksort algorithm
140\& use sort '_mergesort'; # use a mergesort algorithm
141\& use sort 'defaults'; # revert to default behavior
142\& no sort 'stable'; # stability not important
143.Ve
144.PP
145.Vb 1
146\& use sort '_qsort'; # alias for quicksort
147.Ve
148.PP
149.Vb 1
150\& my $current = sort::current(); # identify prevailing algorithm
151.Ve
152.SH "DESCRIPTION"
153.IX Header "DESCRIPTION"
154With the \f(CW\*(C`sort\*(C'\fR pragma you can control the behaviour of the builtin
155\&\f(CW\*(C`sort()\*(C'\fR function.
156.PP
157In Perl versions 5.6 and earlier the quicksort algorithm was used to
158implement \f(CW\*(C`sort()\*(C'\fR, but in Perl 5.8 a mergesort algorithm was also made
159available, mainly to guarantee worst case O(N log N) behaviour:
160the worst case of quicksort is O(N**2). In Perl 5.8 and later,
161quicksort defends against quadratic behaviour by shuffling large
162arrays before sorting.
163.PP
164A stable sort means that for records that compare equal, the original
165input ordering is preserved. Mergesort is stable, quicksort is not.
166Stability will matter only if elements that compare equal can be
167distinguished in some other way. That means that simple numerical
168and lexical sorts do not profit from stability, since equal elements
169are indistinguishable. However, with a comparison such as
170.PP
171.Vb 1
172\& { substr($a, 0, 3) cmp substr($b, 0, 3) }
173.Ve
174.PP
175stability might matter because elements that compare equal on the
176first 3 characters may be distinguished based on subsequent characters.
177In Perl 5.8 and later, quicksort can be stabilized, but doing so will
178add overhead, so it should only be done if it matters.
179.PP
180The best algorithm depends on many things. On average, mergesort
181does fewer comparisons than quicksort, so it may be better when
182complicated comparison routines are used. Mergesort also takes
183advantage of pre-existing order, so it would be favored for using
184\&\f(CW\*(C`sort()\*(C'\fR to merge several sorted arrays. On the other hand, quicksort
185is often faster for small arrays, and on arrays of a few distinct
186values, repeated many times. You can force the
187choice of algorithm with this pragma, but this feels heavy\-handed,
188so the subpragmas beginning with a \f(CW\*(C`_\*(C'\fR may not persist beyond Perl 5.8.
189The default algorithm is mergesort, which will be stable even if
190you do not explicitly demand it.
191But the stability of the default sort is a side-effect that could
192change in later versions. If stability is important, be sure to
193say so with a
194.PP
195.Vb 1
196\& use sort 'stable';
197.Ve
198.PP
199The \f(CW\*(C`no sort\*(C'\fR pragma doesn't
200\&\fIforbid\fR what follows, it just leaves the choice open. Thus, after
201.PP
202.Vb 1
203\& no sort qw(_mergesort stable);
204.Ve
205.PP
206a mergesort, which happens to be stable, will be employed anyway.
207Note that
208.PP
209.Vb 2
210\& no sort "_quicksort";
211\& no sort "_mergesort";
212.Ve
213.PP
214have exactly the same effect, leaving the choice of sort algorithm open.
215.SH "CAVEATS"
216.IX Header "CAVEATS"
217This pragma is not lexically scoped: its effect is global to the program
218it appears in. That means the following will probably not do what you
219expect, because \fIboth\fR pragmas take effect at compile time, before
220\&\fIeither\fR \f(CW\*(C`sort()\*(C'\fR happens.
221.PP
222.Vb 11
223\& { use sort "_quicksort";
224\& print sort::current . "\en";
225\& @a = sort @b;
226\& }
227\& { use sort "stable";
228\& print sort::current . "\en";
229\& @c = sort @d;
230\& }
231\& # prints:
232\& # quicksort stable
233\& # quicksort stable
234.Ve
235.PP
236You can achieve the effect you probably wanted by using \f(CW\*(C`eval()\*(C'\fR
237to defer the pragmas until run time. Use the quoted argument
238form of \f(CW\*(C`eval()\*(C'\fR, \fInot\fR the \s-1BLOCK\s0 form, as in
239.PP
240.Vb 1
241\& eval { use sort "_quicksort" }; # WRONG
242.Ve
243.PP
244or the effect will still be at compile time.
245Reset to default options before selecting other subpragmas
246(in case somebody carelessly left them on) and after sorting,
247as a courtesy to others.
248.PP
249.Vb 14
250\& { eval 'use sort qw(defaults _quicksort)'; # force quicksort
251\& eval 'no sort "stable"'; # stability not wanted
252\& print sort::current . "\en";
253\& @a = sort @b;
254\& eval 'use sort "defaults"'; # clean up, for others
255\& }
256\& { eval 'use sort qw(defaults stable)'; # force stability
257\& print sort::current . "\en";
258\& @c = sort @d;
259\& eval 'use sort "defaults"'; # clean up, for others
260\& }
261\& # prints:
262\& # quicksort
263\& # stable
264.Ve
265.PP
266Scoping for this pragma may change in future versions.