// Bubble-sort using ranks
  public static void bubbleSort1(Sequence S) {
    int n = S.size();
    for (int i=0; i < n; i++)	// i-th pass
      for (int j=1; j < n-i; j++) 
	if ( valAtRank(S, j-1) > valAtRank(S, j) )
	  S.swapElements(S.atRank(j-1), S.atRank(j));
  }
  // Bubble-sort using positions
  public static void bubbleSort2(Sequence S) {
    Position prec, succ;
    int n = S.size();
    for (int i=0; i < n; i++) {	// i-th pass
      prec = S.first();
      for (int j=1; j < n-i; j++) {
	succ = S.after(prec);
	if ( valAtPos(prec) > valAtPos(succ) )
	  S.swapElements(prec, succ);
	prec = succ;
      }
    }
  }
  private static int valAtRank(Sequence S, int i) {
    return ((Integer) S.elemAtRank(i)).intValue();
  }
  private static int valAtPos(Position p) {
    return ((Integer) p.element()).intValue();
  }