Listing 1 Bose-Nelson algorithm for generating sorting networks

/* Calling bose(n) generates a network
 * to sort n items. See R. C. Bose & R. J. Nelson,
 * "A Sorting Problem", JACM Vol. 9, Pp. 282-296. */
bose(n)
int n;
{
   Pstar(1, n); /* sort the sequence {X1,...,Xn} */
}

P(i, j)
int i, j;
{
   printf("swap(%d, %d);\n", i, j);
}

Pstar(i, m)
int i;  /* value of first element in sequence */
int m;  /* length of sequence */
{
   int a;

   if(m > 1)
   {
      /* Partition into 2 shorter sequences,
       * generate a sorting method for each,
       * and merge the two sub-networks. */
      a = m/2;
      Pstar(i, a);
      Pstar((i + a), (m - a));
      Pbracket(i, a, (i + a), (m - a));
   }
}

Pbracket(i, x, j, y)
int i;  /* value of first element in sequence 1 */
int x;  /* length of sequence 1 */
int j;  /* value of first element in sequence 2 */
int y;  /* length of sequence 2 */
{
   int a, b;

   if(x == 1 && y == 1)
      P(i, j); /* 1 comparison sorts 2 items */
   else if(x == 1 && y == 2)
   {
      /* 2 comparisons inserts an item into an
       * already sorted sequence of length 2. */
      P(i, (j + 1));
      P(i, j);
   }
   else if(x == 2 && y == 1)
   {
      /* As above, but inserting j */
      P(i, j);
      P((i + 1), j);
   }
   else
   {
      /* Recurse on shorter sequences, attempting
       * to make the length of one subsequence odd
       * and the length of the other even. If we
       * can do this, we eventually merge the two. */
      a = x/2;
      b = (x & 1) ? (y/2) : ((y + 1)/2);
      Pbracket(i, a, j, b);
      Pbracket((i + a), (x - a), (j + b), (y - b));
      Pbracket((i + a), (x - a), j, b);
   }
}
/* End of File */