     procedure sort( var r : ArrayToSort; lo, up : integer );

     var  iwk : ArrayIndices;
          out : ArrayToSort;
          tempr : ArrayEntry;
          i, j : integer;
          flag : boolean;
     begin

     iwk[lo] := lo-1;
     for i:=lo+1 to up do iwk[i] := 0;
     for i:=lo to up do begin
          j := phi( r[i].k, lo, up );
          iwk[j] := iwk[j]+1
          end;
     for i:=lo to up-1 do iwk[i+1] := iwk[i+1] + iwk[i];
     for i:=up downto lo do begin
          j := phi( r[i].k, lo, up );
          out[ iwk[j] ] := r[i];
          iwk[j] := iwk[j]-1
          end;
     for i:=lo to up do r[i] := out[i];
     {*** Linear-insertion sort phase ***}
     for i:=up-1 downto lo do begin
          tempr := r[i];
          j := i+1;
          flag := true;
          while (j<=up) and flag do
               if tempr.k > r[j].k then begin
                    r[j-1] := r[j];
                    j := j+1
                    end
               else flag := false;
          r[j-1] := tempr
          end;
     end;
