예제 #1
0
파일: archon3.cpp 프로젝트: kvark/dark
/* 
*	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
	}
}
예제 #2
0
파일: ArchonX1.c 프로젝트: libor-m/adark
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;