/* * ray - the modified mkqsort * deep = bin-boff, dword comparsions */ void ray(int *A, int *B, register uchar *boff) { register int *x,*y,*z; while(B-A > INSERT) { int s = median(A[0],A[(B-A)>>1],B[-1],boff); ulong w = p4b(s+boff); x=y=A; z=B; do { ulong q = p4b((s=*y)+boff); //check bound if(q < w || s+boff<=bin-4) { *y++ = *x; *x++ = s; }else if(q > w) { *y = *--z; *z = s; }else y++; }while(y<z); if(A+1 < x) ray(A,x,boff); if(z+1 < B) ray(z,B,boff); A = x; B = z; boff-=4; }//insertion for(x=A+1; x<B; x++) { int s = *(z=x); while(--z>=A && isab(boff+z[0],boff+s)) z[1] = z[0]; z[1] = s; //in place } }
void ray(uint A,uint B,uchar *u) { int x,z; //bazis st: if(STATS) w2 += B-A; if (B-A < LIN) { for(w=A+1; w<B; w++) { i=p[w]; q=w; while(--q>=A && isab(u+p[q],u+i)) p[q+1] = p[q]; p[q+1]=i; } return; }//the stonecode if(DEBUG) cprintf("\r%8d%8d",u-bin,ch); i=p[(A+B)>>1]; if(u+i >= bin+n) { p[(A+B)>>1] = p[B-1]; p[B-1] = i; i=p[A]; B--; }x=A; z=B;