From a0a4ecadc745f0c7b534919a5cc579bb038d59f4 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Fri, 26 Aug 2022 16:07:00 -0400 Subject: [PATCH] 1-byte sorting: insertion, bucket, counting --- src/builtins/sort.c | 79 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/src/builtins/sort.c b/src/builtins/sort.c index b5b17ca5..7c274800 100644 --- a/src/builtins/sort.c +++ b/src/builtins/sort.c @@ -27,12 +27,69 @@ typedef struct I32I32p { i32 k; i32 v; } I32I32p; #define SORT_TYPE i32 #include "sortTemplate.h" +#define INSERTION_SORT(T, CMP) \ + rp[0] = xp[0]; \ + for (usz i=0; ie; j--) { i+=c0[j]; rp[i]--; } \ + for (usz i=1; i0; ) for (usz c=c0[j]; c--; ) *rp++ = j-C/2; \ + } + B and_c1(B t, B x) { if (isAtm(x) || RNK(x)==0) thrM("∧: Argument cannot have rank 0"); if (RNK(x)!=1) return bqn_merge(and_c1(t, toCells(x))); usz xia = IA(x); + if (xia <= 1) return x; u8 xe = TI(x,elType); if (xe<=el_i32) { + if (xe==el_i8) { + i8* xp = i8any_ptr(x); usz n=xia; + i8* rp; B r = m_i8arrv(&rp, n); + if (n<16) { + INSERTION_SORT(i8,<); + } else if (n<=256) { + // Radix/bucket sort + TALLOC(u8, c0, 256); u8 *c0o=c0+128; // Offset for signedness + for (usz j=0; j<256; j++) c0[j]=0; + for (usz i=0; i>=56; + } + for (usz i=0; i); + } else if (n<=256) { + // Radix/bucket sort + TALLOC(u8, c0, 256); u8 *c0o=c0+128; // Offset for signedness + for (usz j=0; j<256; j++) c0[j]=0; + for (usz i=0; i>8; s+=s>>16; s+=s>>32; + cw[j] = p|(s>>8); s<<=56; + } + for (usz i=0; i