comparison lib/array-mergesort.h @ 12421:e8d2c6fc33ad

Use spaces for indentation, not tabs.
author Bruno Haible <bruno@clisp.org>
date Thu, 10 Dec 2009 20:28:30 +0100
parents d11190b43f68
children c2cbabec01dd
comparison
equal deleted inserted replaced
12420:5850b9a81029 12421:e8d2c6fc33ad
45 ELEMENT *dst) 45 ELEMENT *dst)
46 { 46 {
47 for (;;) /* while (n1 > 0 && n2 > 0) */ 47 for (;;) /* while (n1 > 0 && n2 > 0) */
48 { 48 {
49 if (COMPARE (src1, src2) <= 0) 49 if (COMPARE (src1, src2) <= 0)
50 { 50 {
51 *dst++ = *src1++; 51 *dst++ = *src1++;
52 n1--; 52 n1--;
53 if (n1 == 0) 53 if (n1 == 0)
54 break; 54 break;
55 } 55 }
56 else 56 else
57 { 57 {
58 *dst++ = *src2++; 58 *dst++ = *src2++;
59 n2--; 59 n2--;
60 if (n2 == 0) 60 if (n2 == 0)
61 break; 61 break;
62 } 62 }
63 } 63 }
64 /* Here n1 == 0 || n2 == 0 but also n1 > 0 || n2 > 0. */ 64 /* Here n1 == 0 || n2 == 0 but also n1 > 0 || n2 > 0. */
65 if (n1 > 0) 65 if (n1 > 0)
66 { 66 {
67 if (dst != src1) 67 if (dst != src1)
68 do 68 do
69 { 69 {
70 *dst++ = *src1++; 70 *dst++ = *src1++;
71 n1--; 71 n1--;
72 } 72 }
73 while (n1 > 0); 73 while (n1 > 0);
74 } 74 }
75 else /* n2 > 0 */ 75 else /* n2 > 0 */
76 { 76 {
77 if (dst != src2) 77 if (dst != src2)
78 do 78 do
79 { 79 {
80 *dst++ = *src2++; 80 *dst++ = *src2++;
81 n2--; 81 n2--;
82 } 82 }
83 while (n2 > 0); 83 while (n2 > 0);
84 } 84 }
85 } 85 }
86 86
87 /* Sort src[0..n-1] into dst[0..n-1], using tmp[0..n/2-1] as temporary 87 /* Sort src[0..n-1] into dst[0..n-1], using tmp[0..n/2-1] as temporary
88 (scratch) storage. 88 (scratch) storage.
99 dst[0] = src[0]; 99 dst[0] = src[0];
100 return; 100 return;
101 case 2: 101 case 2:
102 /* Trivial case. */ 102 /* Trivial case. */
103 if (COMPARE (&src[0], &src[1]) <= 0) 103 if (COMPARE (&src[0], &src[1]) <= 0)
104 { 104 {
105 /* src[0] <= src[1] */ 105 /* src[0] <= src[1] */
106 dst[0] = src[0]; 106 dst[0] = src[0];
107 dst[1] = src[1]; 107 dst[1] = src[1];
108 } 108 }
109 else 109 else
110 { 110 {
111 dst[0] = src[1]; 111 dst[0] = src[1];
112 dst[1] = src[0]; 112 dst[1] = src[0];
113 } 113 }
114 break; 114 break;
115 case 3: 115 case 3:
116 /* Simple case. */ 116 /* Simple case. */
117 if (COMPARE (&src[0], &src[1]) <= 0) 117 if (COMPARE (&src[0], &src[1]) <= 0)
118 { 118 {
119 if (COMPARE (&src[1], &src[2]) <= 0) 119 if (COMPARE (&src[1], &src[2]) <= 0)
120 { 120 {
121 /* src[0] <= src[1] <= src[2] */ 121 /* src[0] <= src[1] <= src[2] */
122 dst[0] = src[0]; 122 dst[0] = src[0];
123 dst[1] = src[1]; 123 dst[1] = src[1];
124 dst[2] = src[2]; 124 dst[2] = src[2];
125 } 125 }
126 else if (COMPARE (&src[0], &src[2]) <= 0) 126 else if (COMPARE (&src[0], &src[2]) <= 0)
127 { 127 {
128 /* src[0] <= src[2] < src[1] */ 128 /* src[0] <= src[2] < src[1] */
129 dst[0] = src[0]; 129 dst[0] = src[0];
130 dst[1] = src[2]; 130 dst[1] = src[2];
131 dst[2] = src[1]; 131 dst[2] = src[1];
132 } 132 }
133 else 133 else
134 { 134 {
135 /* src[2] < src[0] <= src[1] */ 135 /* src[2] < src[0] <= src[1] */
136 dst[0] = src[2]; 136 dst[0] = src[2];
137 dst[1] = src[0]; 137 dst[1] = src[0];
138 dst[2] = src[1]; 138 dst[2] = src[1];
139 } 139 }
140 } 140 }
141 else 141 else
142 { 142 {
143 if (COMPARE (&src[0], &src[2]) <= 0) 143 if (COMPARE (&src[0], &src[2]) <= 0)
144 { 144 {
145 /* src[1] < src[0] <= src[2] */ 145 /* src[1] < src[0] <= src[2] */
146 dst[0] = src[1]; 146 dst[0] = src[1];
147 dst[1] = src[0]; 147 dst[1] = src[0];
148 dst[2] = src[2]; 148 dst[2] = src[2];
149 } 149 }
150 else if (COMPARE (&src[1], &src[2]) <= 0) 150 else if (COMPARE (&src[1], &src[2]) <= 0)
151 { 151 {
152 /* src[1] <= src[2] < src[0] */ 152 /* src[1] <= src[2] < src[0] */
153 dst[0] = src[1]; 153 dst[0] = src[1];
154 dst[1] = src[2]; 154 dst[1] = src[2];
155 dst[2] = src[0]; 155 dst[2] = src[0];
156 } 156 }
157 else 157 else
158 { 158 {
159 /* src[2] < src[1] < src[0] */ 159 /* src[2] < src[1] < src[0] */
160 dst[0] = src[2]; 160 dst[0] = src[2];
161 dst[1] = src[1]; 161 dst[1] = src[1];
162 dst[2] = src[0]; 162 dst[2] = src[0];
163 } 163 }
164 } 164 }
165 break; 165 break;
166 default: 166 default:
167 { 167 {
168 size_t n1 = n / 2; 168 size_t n1 = n / 2;
169 size_t n2 = (n + 1) / 2; 169 size_t n2 = (n + 1) / 2;
170 /* Note: n1 + n2 = n, n1 <= n2. */ 170 /* Note: n1 + n2 = n, n1 <= n2. */
171 /* Sort src[n1..n-1] into dst[n1..n-1], scratching tmp[0..n2/2-1]. */ 171 /* Sort src[n1..n-1] into dst[n1..n-1], scratching tmp[0..n2/2-1]. */
172 merge_sort_fromto (src + n1, dst + n1, n2, tmp); 172 merge_sort_fromto (src + n1, dst + n1, n2, tmp);
173 /* Sort src[0..n1-1] into tmp[0..n1-1], scratching dst[0..n1-1]. */ 173 /* Sort src[0..n1-1] into tmp[0..n1-1], scratching dst[0..n1-1]. */
174 merge_sort_fromto (src, tmp, n1, dst); 174 merge_sort_fromto (src, tmp, n1, dst);
175 /* Merge the two half results. */ 175 /* Merge the two half results. */
176 merge (tmp, n1, dst + n1, n2, dst); 176 merge (tmp, n1, dst + n1, n2, dst);
177 } 177 }
178 break; 178 break;
179 } 179 }
180 } 180 }
181 181
191 /* Nothing to do. */ 191 /* Nothing to do. */
192 return; 192 return;
193 case 2: 193 case 2:
194 /* Trivial case. */ 194 /* Trivial case. */
195 if (COMPARE (&src[0], &src[1]) <= 0) 195 if (COMPARE (&src[0], &src[1]) <= 0)
196 { 196 {
197 /* src[0] <= src[1] */ 197 /* src[0] <= src[1] */
198 } 198 }
199 else 199 else
200 { 200 {
201 ELEMENT t = src[0]; 201 ELEMENT t = src[0];
202 src[0] = src[1]; 202 src[0] = src[1];
203 src[1] = t; 203 src[1] = t;
204 } 204 }
205 break; 205 break;
206 case 3: 206 case 3:
207 /* Simple case. */ 207 /* Simple case. */
208 if (COMPARE (&src[0], &src[1]) <= 0) 208 if (COMPARE (&src[0], &src[1]) <= 0)
209 { 209 {
210 if (COMPARE (&src[1], &src[2]) <= 0) 210 if (COMPARE (&src[1], &src[2]) <= 0)
211 { 211 {
212 /* src[0] <= src[1] <= src[2] */ 212 /* src[0] <= src[1] <= src[2] */
213 } 213 }
214 else if (COMPARE (&src[0], &src[2]) <= 0) 214 else if (COMPARE (&src[0], &src[2]) <= 0)
215 { 215 {
216 /* src[0] <= src[2] < src[1] */ 216 /* src[0] <= src[2] < src[1] */
217 ELEMENT t = src[1]; 217 ELEMENT t = src[1];
218 src[1] = src[2]; 218 src[1] = src[2];
219 src[2] = t; 219 src[2] = t;
220 } 220 }
221 else 221 else
222 { 222 {
223 /* src[2] < src[0] <= src[1] */ 223 /* src[2] < src[0] <= src[1] */
224 ELEMENT t = src[0]; 224 ELEMENT t = src[0];
225 src[0] = src[2]; 225 src[0] = src[2];
226 src[2] = src[1]; 226 src[2] = src[1];
227 src[1] = t; 227 src[1] = t;
228 } 228 }
229 } 229 }
230 else 230 else
231 { 231 {
232 if (COMPARE (&src[0], &src[2]) <= 0) 232 if (COMPARE (&src[0], &src[2]) <= 0)
233 { 233 {
234 /* src[1] < src[0] <= src[2] */ 234 /* src[1] < src[0] <= src[2] */
235 ELEMENT t = src[0]; 235 ELEMENT t = src[0];
236 src[0] = src[1]; 236 src[0] = src[1];
237 src[1] = t; 237 src[1] = t;
238 } 238 }
239 else if (COMPARE (&src[1], &src[2]) <= 0) 239 else if (COMPARE (&src[1], &src[2]) <= 0)
240 { 240 {
241 /* src[1] <= src[2] < src[0] */ 241 /* src[1] <= src[2] < src[0] */
242 ELEMENT t = src[0]; 242 ELEMENT t = src[0];
243 src[0] = src[1]; 243 src[0] = src[1];
244 src[1] = src[2]; 244 src[1] = src[2];
245 src[2] = t; 245 src[2] = t;
246 } 246 }
247 else 247 else
248 { 248 {
249 /* src[2] < src[1] < src[0] */ 249 /* src[2] < src[1] < src[0] */
250 ELEMENT t = src[0]; 250 ELEMENT t = src[0];
251 src[0] = src[2]; 251 src[0] = src[2];
252 src[2] = t; 252 src[2] = t;
253 } 253 }
254 } 254 }
255 break; 255 break;
256 default: 256 default:
257 { 257 {
258 size_t n1 = n / 2; 258 size_t n1 = n / 2;
259 size_t n2 = (n + 1) / 2; 259 size_t n2 = (n + 1) / 2;
260 /* Note: n1 + n2 = n, n1 <= n2. */ 260 /* Note: n1 + n2 = n, n1 <= n2. */
261 /* Sort src[n1..n-1], scratching tmp[0..n2-1]. */ 261 /* Sort src[n1..n-1], scratching tmp[0..n2-1]. */
262 merge_sort_inplace (src + n1, n2, tmp); 262 merge_sort_inplace (src + n1, n2, tmp);
263 /* Sort src[0..n1-1] into tmp[0..n1-1], scratching tmp[n1..2*n1-1]. */ 263 /* Sort src[0..n1-1] into tmp[0..n1-1], scratching tmp[n1..2*n1-1]. */
264 merge_sort_fromto (src, tmp, n1, tmp + n1); 264 merge_sort_fromto (src, tmp, n1, tmp + n1);
265 /* Merge the two half results. */ 265 /* Merge the two half results. */
266 merge (tmp, n1, src + n1, n2, src); 266 merge (tmp, n1, src + n1, n2, src);
267 } 267 }
268 break; 268 break;
269 } 269 }
270 } 270 }
271 271