diff options
author | 2017-05-17 21:24:48 +0000 | |
---|---|---|
committer | 2017-05-17 21:24:48 +0000 | |
commit | 0f51eee8a648b09ae540f3b2c482800d3bdd4f2d (patch) | |
tree | 5669a7d5486d3cc26f43fd4ea10ea3ad3e6462dc /regress/lib/libc/qsort/qsort_test.c | |
parent | Do not warn if a database file does not exist (diff) | |
download | wireguard-openbsd-0f51eee8a648b09ae540f3b2c482800d3bdd4f2d.tar.xz wireguard-openbsd-0f51eee8a648b09ae540f3b2c482800d3bdd4f2d.zip |
Add "median of three" killer, as seen in "Introspective Sorting and
Selection Algorithms" by David R Musser.
Diffstat (limited to 'regress/lib/libc/qsort/qsort_test.c')
-rw-r--r-- | regress/lib/libc/qsort/qsort_test.c | 62 |
1 files changed, 44 insertions, 18 deletions
diff --git a/regress/lib/libc/qsort/qsort_test.c b/regress/lib/libc/qsort/qsort_test.c index 3b36eb06b49..221770e0ac2 100644 --- a/regress/lib/libc/qsort/qsort_test.c +++ b/regress/lib/libc/qsort/qsort_test.c @@ -33,7 +33,8 @@ enum distribution { STAGGER, PLATEAU, SHUFFLE, - KILLER, + BSD_KILLER, + MED3_KILLER, INVALID }; @@ -91,35 +92,60 @@ fill_test_array(int *x, int n, int dist, int m) { int i, j, k; - for (i = 0, j = 0, k = 1; i < n; i++) { - switch (dist) { - case SAWTOOTH: + switch (dist) { + case SAWTOOTH: + for (i = 0; i < n; i++) x[i] = i % m; - break; - case RAND: + break; + case RAND: + for (i = 0; i < n; i++) x[i] = arc4random_uniform(m); - break; - case STAGGER: + break; + case STAGGER: + for (i = 0; i < n; i++) x[i] = (i * m + i) % n; - break; - case PLATEAU: + break; + case PLATEAU: + for (i = 0; i < n; i++) x[i] = min(i, m); - break; - case SHUFFLE: + break; + case SHUFFLE: + for (i = 0, j = 0, k = 1; i < n; i++) x[i] = arc4random_uniform(m) ? (j += 2) : (k += 2); - break; - case KILLER: - k = n / 2; + break; + case BSD_KILLER: + /* 4.4BSD insertion sort optimization killer, Mats Linander */ + k = n / 2; + for (i = 0; i < n; i++) { if (i < k) x[i] = k - i; else if (i > k) x[i] = n + k + 1 - i; else x[i] = k + 1; - break; - default: - err(1, "unexpected distribution %d", dist); } + break; + case MED3_KILLER: + /* + * Median of 3 killer, as seen in David R Musser's + * Introspective Sorting and Selection Algorithms + */ + if (n & 1) { + /* odd size, store last at end and make even. */ + x[n - 1] = n; + n--; + } + k = n / 2; + for (i = 0; i < n; i++) { + if (i & 1) { + x[i] = k + x[i - 1]; + } else { + x[i] = i + 1; + } + } + break; + default: + err(1, "unexpected distribution %d", dist); } } |