diff options
| author | millert <> | 2017-05-17 21:24:48 +0000 |
|---|---|---|
| committer | millert <> | 2017-05-17 21:24:48 +0000 |
| commit | 0bbcaddbe494193e0624899bc6fc248cb71da1b6 (patch) | |
| tree | e9734a6c3f0e410cd7f45b86ff67aa7246151ba6 /src | |
| parent | 8d603a07f4d3001dcb3dbd41181d29c15d99b605 (diff) | |
| download | openbsd-0bbcaddbe494193e0624899bc6fc248cb71da1b6.tar.gz openbsd-0bbcaddbe494193e0624899bc6fc248cb71da1b6.tar.bz2 openbsd-0bbcaddbe494193e0624899bc6fc248cb71da1b6.zip | |
Add "median of three" killer, as seen in "Introspective Sorting and
Selection Algorithms" by David R Musser.
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 | ||
