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