aboutsummaryrefslogtreecommitdiff
path: root/ja_JP.eucJP/man/man3/qsort.3
blob: 5bfdde2af5d2f9d71dd9e858a2c5071d3e2ab373 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
.\" Copyright (c) 1990, 1991, 1993
.\"	The Regents of the University of California.  All rights reserved.
.\"
.\" This code is derived from software contributed to Berkeley by
.\" the American National Standards Committee X3, on Information
.\" Processing Systems.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\"    notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\"    notice, this list of conditions and the following disclaimer in the
.\"    documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\"    must display the following acknowledgement:
.\"	This product includes software developed by the University of
.\"	California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\"    may be used to endorse or promote products derived from this software
.\"    without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\"     @(#)qsort.3	8.1 (Berkeley) 6/4/93
.\"
.\" $FreeBSD$
.Dd June 4, 1993
.Dt QSORT 3
.Os
.Sh 名称
.Nm qsort, heapsort, mergesort
.Nd ソート関数
.Sh 書式
.Fd #include <stdlib.h>
.Ft void
.Fn qsort "void *base" "size_t nmemb" "size_t size" "int (*compar)(const void *, const void *)"
.Ft int
.Fn heapsort "void *base" "size_t nmemb" "size_t size" "int (*compar)(const void *, const void *)"
.Ft int
.Fn mergesort "void *base" "size_t nmemb" "size_t size" "int (*compar)(const void *, const void *)"
.Sh 解説
.Fn qsort
関数は、パーティション交換ソート、つまりクイックソートの修正版です。 
.Fn heapsort
関数は、選択ソートの修正版です。
.Fn mergesort
関数は、事前設定した順序でデータをソートする指数検索によるマージソートの 
修正版です。
.Pp
.Fn qsort
関数と
.Fn heapsort
関数は、
.Fa base
が指す初期メンバである
.Fa nmemb
オブジェクトの配列をソートします。各オブジェクトのサイズは、
.Fa size
で
指定します。
.Fn mergesort
も同じように動作しますが、
.Fa size
は
.Dq "sizeof(void *) / 2" .
より大きくなければなりません。
.Pp
配列
.Fa base
の内容は、
.Fa compar
が指す比較関数に従って昇順でソートされます。この関数では、比較するオブ
ジェクトを指す、2つの引数が必要です。
.Pp
比較関数は、最初の引数が次の引数より小さい場合は 0より小さい整数、等し
い場合は 0、大きい場合は 0より大きい整数を戻す必要があります。 
.Pp
.Fn qsort
関数と
.Fn heapsort
関数は不安定です。つまり 2つのメンバが等しい場合、ソート済み配列の順序
は不定になります。 
.Fn mergesort
関数は安定しています。
.Pp
.Fn qsort
関数は、パーティション交換ソートのバリエーションである、C.A.R. Hoare 
の ``クイックソート'' アルゴリズムを実装しています。とくに D.E. Knuth 
のアルゴリズム Q を参照してください。
.Fn qsort
には、平均で
O N lg N
の時間がかかります。このシステムは、メジアン選択を使用して、O N**2 
という最悪なケースの動作を回避します。
.Pp
.Fn heapsort
関数は、選択ソートのバリエーションである、J.W.J. William の ``ヒープソー
ト'' アルゴリズムを実装しています。とくに D.E. Knuth のアルゴリズム H
を参照してください。
.Fn heapsort
には、最悪のケースで
O N lg N
の時間がかかります。メモリをほとんど余分に使用しないという点のみが
.Fn qsort
より優れています。
.Fn qsort
はメモリを割り振りませんが、再帰を使用して実現されます。
.Pp
.Fn mergesort
関数では、
.Fa nmemb *
.Fa size
バイトのメモリが余分に必要となります。スペースに余裕がある場合のみに使
用してください。 
.Fn mergesort
は、事前設定した順序のデータで最適化されます。最悪のケースの時間は 
O N lg N で、最善のケースは O N です。
.Pp
通常は、
.Fn heapsort
より
.Fn mergesort
の方が速く、
.Fn mergesort
より
.Fn qsort
の方が高速です。使用できるメモリ量やデータの事前設定順序により、この状
況は変化します。 
.Sh 戻り値
.Fn qsort
関数は値を戻しません。
.Pp
問題なく終了すると、
.Fn heapsort
と
.Fn mergesort
は 0を戻します。問題がある場合は \-1 を戻し、そのエラーを示す値にグロー
バル変数 
.Va errno
を設定します。
.Sh エラー
.Fn heapsort
関数と
.Fn mergesort
関数は、以下のような場合にエラーとなります。
.Bl -tag -width Er
.It Bq Er EINVAL
.Fa size
引数が 0であるか、
.Fn mergesort
の
.Fa size
引数が
.Dq "sizeof void * / 2"
より小さい場合。
.It Bq Er ENOMEM
.Fn heapsort
か
.Fn mergesort
がメモリを割り振れなかった場合。
.El
.Sh 互換性
旧バージョンの
.Fn qsort
では、比較ルーチンが
.Fn qsort 3
を呼び出すことはできませんでした。現在は呼び出せます。
.Sh 関連項目
.Xr sort 1 ,
.Xr radixsort 3
.Rs
.%A Hoare, C.A.R.
.%D 1962
.%T "Quicksort"
.%J "The Computer Journal"
.%V 5:1
.%P pp. 10-15
.Re
.Rs
.%A Williams, J.W.J
.%D 1964
.%T "Heapsort"
.%J "Communications of the ACM"
.%V 7:1
.%P pp. 347-348
.Re
.Rs
.%A Knuth, D.E.
.%D 1968
.%B "The Art of Computer Programming"
.%V Vol. 3
.%T "Sorting and Searching"
.%P pp. 114-123, 145-149
.Re
.Rs
.%A Mcilroy, P.M.
.%T "Optimistic Sorting and Information Theoretic Complexity"
.%J "Fourth Annual ACM-SIAM Symposium on Discrete Algorithms"
.%V January 1992
.Re
.Rs
.%A Bentley, J.L.
.%T "Engineering a Sort Function"
.%J "bentley@research.att.com"
.%V January 1992
.Re
.Sh 規格
.Fn qsort
関数は、
.St -ansiC
に準拠しています。