diff options
Diffstat (limited to 'src')
| -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 | ||
