32
32
#include <string.h>
33
33
34
34
#define MIN (x ,y ) (((x)<(y)) ? (x) : (y))
35
+ #define MEDIAN3 (a ,b ,c ) (((a)<(b)) ? \
36
+ ((b)<(c) ? (b) : ((a)<(c) ? (c) : (a))) : \
37
+ ((b)>(c) ? (b) : ((a)>(c) ? (c) : (a))))
35
38
36
39
static void split (int64_t * I ,int64_t * V ,int64_t start ,int64_t len ,int64_t h )
37
40
{
38
- int64_t i ,j ,k ,x ,tmp ,jj ,kk ;
41
+ int64_t i ,j ,k ,x ,y , z , tmp ,jj ,kk ;
39
42
40
43
if (len < 16 ) {
41
44
for (k = start ;k < start + len ;k += j ) {
@@ -56,7 +59,20 @@ static void split(int64_t *I,int64_t *V,int64_t start,int64_t len,int64_t h)
56
59
return ;
57
60
};
58
61
59
- x = V [I [start + len /2 ]+ h ];
62
+ /* Select pivot, algorithm by Bentley & McIlroy */
63
+ j = start + len /2 ;
64
+ k = start + len - 1 ;
65
+ x = V [I [j ]+ h ];
66
+ y = V [I [start ]+ h ];
67
+ z = V [I [k ]+ h ];
68
+ if (len > 40 ) { /* Big array: Pseudomedian of 9 */
69
+ tmp = len /8 ;
70
+ x = MEDIAN3 (x ,V [I [j - tmp ]+ h ],V [I [j + tmp ]+ h ]);
71
+ y = MEDIAN3 (y ,V [I [start + tmp ]+ h ],V [I [start + tmp + tmp ]+ h ]);
72
+ z = MEDIAN3 (z ,V [I [k - tmp ]+ h ],V [I [k - tmp - tmp ]+ h ]);
73
+ }; /* Else medium array: Pseudomedian of 3 */
74
+ x = MEDIAN3 (x ,y ,z );
75
+
60
76
jj = 0 ;kk = 0 ;
61
77
for (i = start ;i < start + len ;i ++ ) {
62
78
if (V [I [i ]+ h ]< x ) jj ++ ;
0 commit comments