|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 1622 (0x656) Types: TextFile Names: »sort2.c«
└─⟦87ddcff64⟧ Bits:30001253 CPHDIST85 Tape, 1985 Autumn Conference Copenhagen └─⟦this⟧ »cph85dist/wirewrap/sort2.c«
/******************************************************* * Batcher's method sort by signalname. * * Reference: Knuth Sorting & Searching, Section 5.2.2 * *******************************************************/ #include "wirewrap.h" sort2() { struct pin tempin; int p,q,r,d,n,i,j,m; int a,b,innera,innerb,outera,outerb; /*Find the 'middle' of the array.*/ n = nextfree; i = 1; j = 2; while(j < n) { i = j; j = j+j; } m = i; /*m is the middle of the array*/ /* Batcher's method*/ p = m; while(p > 0) { q = m; r = 0; d =p; for(;;) { for(i= 0;i < n-d;i++) { if ( (i&p) == r) if( (pinarray[i].row > pinarray[i+d].row) || ((pinarray[i].row == pinarray[i+d].row) && (pinarray[i].col > pinarray[i+d].col))) { /* First decide which two to swap. */ a=i; b=i+d; /* Then decide which ones reference them. */ innera = pinarray[a].inner; outera = pinarray[a].outer; innerb=pinarray[b].inner; outerb=pinarray[b].outer; /* Update those. */ if(innera != -1)pinarray[innera].inner=b; if(outera != -1)pinarray[outera].outer=b; if(innerb != -1)pinarray[innerb].inner=a; if(outerb != -1)pinarray[outerb].outer=a; /* Now make the swap. */ tempin = pinarray[b]; pinarray[b] = pinarray[a]; pinarray[a] = tempin; } } if(p != q) { d = q - p; q = q/2; r = p; } else break; } p = p/2; } }