summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/regress/lib/libc/qsort/qsort_test.c62
1 files changed, 44 insertions, 18 deletions
diff --git a/src/regress/lib/libc/qsort/qsort_test.c b/src/regress/lib/libc/qsort/qsort_test.c
index 3b36eb06b4..221770e0ac 100644
--- a/src/regress/lib/libc/qsort/qsort_test.c
+++ b/src/regress/lib/libc/qsort/qsort_test.c
@@ -33,7 +33,8 @@ enum distribution {
33 STAGGER, 33 STAGGER,
34 PLATEAU, 34 PLATEAU,
35 SHUFFLE, 35 SHUFFLE,
36 KILLER, 36 BSD_KILLER,
37 MED3_KILLER,
37 INVALID 38 INVALID
38}; 39};
39 40
@@ -91,35 +92,60 @@ fill_test_array(int *x, int n, int dist, int m)
91{ 92{
92 int i, j, k; 93 int i, j, k;
93 94
94 for (i = 0, j = 0, k = 1; i < n; i++) { 95 switch (dist) {
95 switch (dist) { 96 case SAWTOOTH:
96 case SAWTOOTH: 97 for (i = 0; i < n; i++)
97 x[i] = i % m; 98 x[i] = i % m;
98 break; 99 break;
99 case RAND: 100 case RAND:
101 for (i = 0; i < n; i++)
100 x[i] = arc4random_uniform(m); 102 x[i] = arc4random_uniform(m);
101 break; 103 break;
102 case STAGGER: 104 case STAGGER:
105 for (i = 0; i < n; i++)
103 x[i] = (i * m + i) % n; 106 x[i] = (i * m + i) % n;
104 break; 107 break;
105 case PLATEAU: 108 case PLATEAU:
109 for (i = 0; i < n; i++)
106 x[i] = min(i, m); 110 x[i] = min(i, m);
107 break; 111 break;
108 case SHUFFLE: 112 case SHUFFLE:
113 for (i = 0, j = 0, k = 1; i < n; i++)
109 x[i] = arc4random_uniform(m) ? (j += 2) : (k += 2); 114 x[i] = arc4random_uniform(m) ? (j += 2) : (k += 2);
110 break; 115 break;
111 case KILLER: 116 case BSD_KILLER:
112 k = n / 2; 117 /* 4.4BSD insertion sort optimization killer, Mats Linander */
118 k = n / 2;
119 for (i = 0; i < n; i++) {
113 if (i < k) 120 if (i < k)
114 x[i] = k - i; 121 x[i] = k - i;
115 else if (i > k) 122 else if (i > k)
116 x[i] = n + k + 1 - i; 123 x[i] = n + k + 1 - i;
117 else 124 else
118 x[i] = k + 1; 125 x[i] = k + 1;
119 break;
120 default:
121 err(1, "unexpected distribution %d", dist);
122 } 126 }
127 break;
128 case MED3_KILLER:
129 /*
130 * Median of 3 killer, as seen in David R Musser's
131 * Introspective Sorting and Selection Algorithms
132 */
133 if (n & 1) {
134 /* odd size, store last at end and make even. */
135 x[n - 1] = n;
136 n--;
137 }
138 k = n / 2;
139 for (i = 0; i < n; i++) {
140 if (i & 1) {
141 x[i] = k + x[i - 1];
142 } else {
143 x[i] = i + 1;
144 }
145 }
146 break;
147 default:
148 err(1, "unexpected distribution %d", dist);
123 } 149 }
124} 150}
125 151