diff options
-rw-r--r-- | src/regress/lib/libc/qsort/qsort_test.c | 62 |
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 | ||