Skip to content
Snippets Groups Projects
Commit a0529f24 authored by Fredrik Hübinette (Hubbe)'s avatar Fredrik Hübinette (Hubbe)
Browse files

now uses heapsort

Rev: src/fsort_template.h:1.5
parent f484d3c2
Branches
Tags
No related merge requests found
/* /*
* $Id: fsort_template.h,v 1.4 1998/04/27 22:33:17 hubbe Exp $ * $Id: fsort_template.h,v 1.5 1999/04/30 07:25:42 hubbe Exp $
*/ */
#ifndef SWAP #ifndef SWAP
...@@ -16,6 +16,9 @@ ...@@ -16,6 +16,9 @@
#define DEC(X) X=STEP(X,-1) #define DEC(X) X=STEP(X,-1)
#define SIZE ((long)(char *)STEP((TYPE *)0,1)) #define SIZE ((long)(char *)STEP((TYPE *)0,1))
#define PARENT(X) (((X)-1)>>1)
#define CHILD1(X) (((X)<<1)+1)
static void ID(register TYPE *bas, static void ID(register TYPE *bas,
register TYPE *last register TYPE *last
#ifdef EXTRA_ARGS #ifdef EXTRA_ARGS
...@@ -26,67 +29,56 @@ static void ID(register TYPE *bas, ...@@ -26,67 +29,56 @@ static void ID(register TYPE *bas,
#endif #endif
) )
{ {
register TYPE *a,*b, tmp; register TYPE tmp;
if(bas >= last) return; long howmany,x,y,z;
a = STEP(bas,1); #ifdef PIKE_DEBUG
if(a == last) extern int d_flag;
{ #endif
if( CMP(bas,last) > 0) SWAP(bas,last);
}else{ howmany=((((char *)last)-((char *)bas))/SIZE)+1;
b=STEP(bas,((((char *)last)-((char *)bas))/SIZE)>>1); if(howmany<2) return;
SWAP(bas,b);
b=last; for(x=PARENT(howmany-1);x>=0;x--)
while(a < b)
{
#if 1
while(a<b)
{ {
y=x;
while(1) while(1)
{ {
if(a<=b && CMP(a,bas) <= 0) z=CHILD1(y);
INC(a); if(z>=howmany) break;
else if(z+1 < howmany && CMP(STEP(bas,z),STEP(bas,z+1))<=0) z++;
{ if(CMP( STEP(bas, y), STEP(bas, z)) >0) break;
while(a< b && CMP(bas,b) <= 0) DEC(b); SWAP( STEP(bas, y), STEP(bas, z));
break; y=z;
}
if(a< b && CMP(bas,b) <= 0)
DEC(b);
else
{
while(a<=b && CMP(a,bas) <= 0) INC(a);
break;
} }
} }
if(a<b) for(x=howmany-1;x;x--)
{ {
SWAP(a,b); SWAP( STEP(bas,x), bas);
INC(a); y=0;
if(b > STEP(a,1)) DEC(b); while(1)
}
}
#else
while(a<=b && CMP(a,bas) < 0) INC(a);
while(a< b && CMP(bas,b) < 0) DEC(b);
if(a<b)
{ {
SWAP(a,b); z=CHILD1(y);
INC(a); if(z>=x) break;
if(b > STEP(a,1)) DEC(b); if(z+1 < x && CMP(STEP(bas,z),STEP(bas,z+1))<=0) z++;
if(CMP( STEP(bas, y), STEP(bas, z)) >0) break;
SWAP( STEP(bas, y), STEP(bas, z));
y=z;
} }
#endif
}
DEC(a);
SWAP(a,bas);
DEC(a);
ID(bas,a XARGS);
ID(b,last XARGS);
} }
#ifdef PIKE_DEBUG
if(d_flag>1)
for(x=howmany-1;x;x--)
if( CMP( STEP(bas,x-1), STEP(bas,x) ) > 0)
fatal("Sorting failed!\n");
#endif
} }
#undef INC #undef INC
#undef DEC #undef DEC
#undef PARENT
#undef CHILD1
#ifdef UNDEF_XARGS #ifdef UNDEF_XARGS
#undef XARGS #undef XARGS
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment