UNPKG

timsort2

Version:

TimSort sorting revived in TypeScript

2 lines (1 loc) 4.01 kB
var O=new ArrayBuffer(160),R=new ArrayBuffer(160),C=7,L=new Float32Array([1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9]);function H(r,o){if(r===o)return 0;if((r|0)===r&&(o|0)===o){if(r===0||o===0)return r-o;if(r<0||o<0){if(o>=0)return-1;if(r>=0)return 1;r=-r,o=-o}let t=Math.log10(r)|0,n=Math.log10(o)|0,i=0;return t<n?(r*=L[n-t-1],o/=10,i=-1):t>n&&(o*=L[t-n-1],r/=10,i=1),r===o?i:r-o}let s=`${r}`,T=`${o}`;return s===T?0:s<T?-1:1}function E(r,o=H,s=0,T=r.length){let t=T-s;if(t<2)return r;if(t<32)return d(r,s,T,s+I(r,s,T,o),o),r;let n=r.length,i=0;n=n<120?5:n<1542?10:n<119151?19:40;let u=new Uint32Array(O,0,n),e=new Uint32Array(R,0,n),f=0,b=t;for(;b>=32;)f|=b&1,b>>=1;let A=f+b,m=C,c=new Array(n<512?n>>1:256);do{for(n=I(r,s,T,o),n<A&&(f=t>A?A:t,d(r,s,s+f,s+n,o),n=f),u[i]=s,e[i]=n,i+=1;i>1;){if(f=i-2,f>=1&&e[f-1]<=e[f]+e[f+1]||f>=2&&e[f-2]<=e[f]+e[f-1])e[f-1]<e[f+1]&&f--;else if(e[f]>e[f+1])break;m=F(r,o,c,f,i--,e,u,m)}t-=n,s+=n}while(t!==0);for(;i>1;)f=i-2,f>0&&e[f-1]<e[f+1]&&f--,m=F(r,o,c,f,i--,e,u,m);return r}function d(r,o,s,T,t){T===o&&T++;let n;for(;T<s;T++){let i=r[T],u=o,e=T;for(;u<e;)t(i,r[n=u+e>>1])<0?e=n:u=n+1;switch(n=T-u,n){case 3:r[u+3]=r[u+2];case 2:r[u+2]=r[u+1];case 1:r[u+1]=r[u];break;default:for(;n>0;)r[u+n]=r[u+n-1],n--}r[u]=i}}function B(r,o,s,T,t,n){let i=s+t,u=0,e,f=1,b;if(n(r,o[i])>0){for(e=T-t;f<e&&n(r,o[i+f])>0;)u=f,f=(f<<1)+1;u+=t,f=t+(e+(f-e>>31&f-e))}else{for(e=t+1;f<e&&n(r,o[i-f])<=0;)u=f,f=(f<<1)+1;b=u,u=t-(e+(f-e>>31&f-e)),f=t-b}for(u++;u<f;)n(r,o[s+(b=u+f>>1)])>0?u=b+1:f=b;return f}function U(r,o,s,T,t,n){let i=s+t,u=0,e,f=1,b;if(n(r,o[i])<0){for(e=t+1;f<e&&n(r,o[i-f])<0;)u=f,f=(f<<1)+1;b=u,u=t-(e+(f-e>>31&f-e)),f=t-b}else{for(e=T-t;f<e&&n(r,o[i+f])>=0;)u=f,f=(f<<1)+1;u+=t,f=t+(e+(f-e>>31&f-e))}for(u++;u<f;)n(r,o[s+(b=u+f>>1)])<0?f=b:u=b+1;return f}function I(r,o,s,T){let t=o+1;if(t===s)return 1;if(T(r[t++],r[o])<0){for(;t<s&&T(r[t],r[t-1])<0;)t++;for(t--;o<t;){let n=r[o];r[o++]=r[t],r[t--]=n}t++}else for(;t<s&&T(r[t],r[t-1])>=0;)t++;return t-o}function F(r,o,s,T,t,n,i,u){let e=i[T],f=n[T],b=i[T+1],A=n[T+1];n[T]=f+A,T===t-3&&(i[T+1]=i[T+2],n[T+1]=n[T+2]);let m=U(r[b],r,e,f,0,o);return e+=m,f-=m,f===0||(A=B(r[e+f-1],r,b,A,A-1,o),A===0)?u:f<=A?_(r,o,s,e,f,b,A,u):S(r,o,s,e,f,b,A,u)}function S(r,o,s,T,t,n,i,u){let e=0;for(e;e<i;e++)s[e]=r[n+e];let f=T+t-1,b=i-1,A=n+i-1,m,c;if(r[A--]=r[f--],--t===0){for(m=A-(i-1),e=0;e<i;e++)r[m+e]=s[e];return u}if(i===1){for(A-=t,f-=t,c=A+1,m=f+1,e=t-1;e>=0;e--)r[c+e]=r[m+e];return r[A]=s[b],u}for(;;){let k=0,w=0,x=!1;do if(o(s[b],r[f])<0){if(r[A--]=r[f--],k++,w=0,--t===0){x=!0;break}}else if(r[A--]=s[b--],w++,k=0,--i===1){x=!0;break}while((k|w)<u);if(x)break;do{if(k=t-U(s[b],r,T,t,t-1,o),k!==0){for(A-=k,f-=k,t-=k,c=A+1,m=f+1,e=k-1;e>=0;e--)r[c+e]=r[m+e];if(t===0){x=!0;break}}if(r[A--]=s[b--],--i===1){x=!0;break}if(w=i-B(r[f],s,0,i,i-1,o),w!==0){for(A-=w,b-=w,i-=w,c=A+1,m=b+1,e=0;e<w;e++)r[c+e]=s[m+e];if(i<=1){x=!0;break}}if(r[A--]=r[f--],--t===0){x=!0;break}u--}while(k>=C||w>=C);if(x)break;u<0&&(u=0),u+=2}if(u<1&&(u=1),i===1){for(A-=t,f-=t,c=A+1,m=f+1,e=t-1;e>=0;e--)r[c+e]=r[m+e];r[A]=s[b]}else{if(i===0)return u;for(m=A-(i-1),e=0;e<i;e++)r[m+e]=s[e]}return u}function _(r,o,s,T,t,n,i,u){let e=0,f=0;for(;e<t;e++)s[e]=r[T+e];if(r[T++]=r[n++],--i===0){for(e=0;e<t;e++)r[T+e]=s[f+e];return u}if(t===1){for(e=0;e<i;e++)r[T+e]=r[n+e];return r[T+i]=s[f],u}for(;;){let b=0,A=0,m=!1;do if(o(r[n],s[f])<0){if(r[T++]=r[n++],A++,b=0,--i===0){m=!0;break}}else if(r[T++]=s[f++],b++,A=0,--t===1){m=!0;break}while((b|A)<u);if(m)break;do{if(b=U(r[n],s,f,t,0,o),b!==0){for(e=0;e<b;e++)r[T+e]=s[f+e];if(T+=b,f+=b,t-=b,t<=1){m=!0;break}}if(r[T++]=r[n++],--i===0){m=!0;break}if(A=B(s[f],r,n,i,0,o),A!==0){for(e=0;e<A;e++)r[T+e]=r[n+e];if(T+=A,n+=A,i-=A,i===0){m=!0;break}}if(r[T++]=s[f++],--t===1){m=!0;break}u--}while(b>=C||A>=C);if(m)break;u<0&&(u=0),u+=2}if(u<1&&(u=1),t===1){for(e=0;e<i;e++)r[T+e]=r[n+e];r[T+i]=s[f]}else{if(t===0)return u;for(e=0;e<t;e++)r[T+e]=s[f+e]}return u}export{H as alphabeticalCompare,E as sort};