#define bin(A) l+count[A]
#define dai digit(a[i], w)
void insertion(itemType a[], int l, int r)
  { 
    int i, j; itemType v;
    for (i = l+1; i <= r; i++)
      { 
        v = a[i]; j = i;
        while (j > l && less(v, a[j-1])) 
          { a[j] = a[j-1]; j--; }
        a[j] = v; 
        if (IEtrace) show(a, l, r);
      } 
  }

/* include code */
void radixMSD(itemType a[], int l, int r, int w)
  { int i, j, count[M+1]; 
    if (w > bytesword) return;
    if (r - l < 20) return;
    for (j = 0; j < M; j++) count[j] = 0;
    for (i = l; i <= r; i++) 
      count[digit(a[i], w) + 1]++;
    for (j = 1; j < M; j++) 
      count[j] += count[j-1];
    for (i = l; i <= r; i++) 
      if (l+count[dai] == i) count[dai]++; else
      if (l+count[dai] < i)
        do
          {  j = l+count[dai]++; exch(a[i], a[j]); }
        while (j != i); 
     radixMSD(a, l, bin(0)-1, w+1);
     for (j = 0; j < M-1; j++)
       radixMSD(a, bin(j), bin(j+1)-1, w+1); 
  
  }
/* end code */

void sort(itemType a[], int l, int r)
  { 
    radixMSD(a, l, r, 0);
    insertion(a, l, r); 
  }

