aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2025-09-15 17:58:02 +0200
committerlemon <lsof@mailbox.org>2025-09-15 17:58:02 +0200
commit1392224851f0b734f185b735eafa1e4119b58688 (patch)
tree1c822b233cf5e7425852d372c7340f81ac55c172
parent2068a1d88c9610432b7ed8b5181e1515702392eb (diff)
test/sort.c
-rw-r--r--test/sort.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/test/sort.c b/test/sort.c
index af58917..8507cb2 100644
--- a/test/sort.c
+++ b/test/sort.c
@@ -12,6 +12,32 @@ icmp(const void *a, const void *b)
return (l > r) - (l < r);
}
+int nswp = 0, ncmp = 0;
+void
+revsort(int *xs, long lo, long hi)
+{
+ while (lo < hi) {
+ long i = lo - 1, p = hi + 1;
+ int pivot = xs[lo], tmp;
+ for (;;) {
+ do ++i; while (++ncmp, xs[i] > pivot);
+ do --p; while (++ncmp, xs[p] < pivot);
+ if (i >= p) break;
+ tmp = xs[i];
+ xs[i] = xs[p];
+ xs[p] = tmp;
+ ++nswp;
+ }
+ if (p + 1 >= hi) {
+ hi = p;
+ } else {
+ if (lo < p)
+ revsort(xs, lo, p);
+ lo = p + 1;
+ }
+ }
+}
+
int
main(int argc, char **argv)
{
@@ -24,5 +50,10 @@ main(int argc, char **argv)
for (int i = 0; i < N; ++i)
printf("%d, ", xs[i]);
printf("\n");
+ revsort(xs, 0,N-1);
+ printf("%d cmps, %d swaps\n", ncmp, nswp);
+ for (int i = 0; i < N; ++i)
+ printf("%d, ", xs[i]);
+ printf("\n");
return N;
}