La cosa forse più intuitiva è questa:

Carica File
Ordina
Salva File

La complessità computazionale non è alta, anzi, è O(nlogn) che è il limite asintotico nativo degli ordinamenti (ovviamente usando Merge Sort)

Ti consiglio di realizzare una classe del tipo

codice:
public class Anagrafica implements Comparable {

   // Proprietà per le quali prevedi anche getter e setter
   private String nome;
   private String cognome;
   private int numero;

   /**
   * Costruttore
   */
   public Anagrafica(String nome, String cognome, int numero) {
      this.nome = nome;
      this.cognome= cognome;
      this.numero= numero;
   }


   /**
   * Redifinizione metodo compareTo
   */
   public int compareTo(Object obj) throws ClassCastException {

      if(! (obj instanceof Anagrafica)) {
         throw new ClassCastException();
      }

      Anagrafica compare = (Anagrafica) obj;
      if(getNumero() < compare.getNumero()) {
         return -1;

      } else if(getNumero() > compare.getNumero()) {
         return 1;

      } else {
         return 0;
      }
   }

}
A questo punto puoi riempire un java.util.Vector di Anagrafica, una per ogni riga ( O(n) ) durante il caricamento del file.

Con il codice seguente, inoltre, ordinerai con mergesort gli elementi del tuo vettore secondo la specifica del metodo compareTo

codice:
// Suppongo che il vettore sia già pieno
java.util.Vector anagrafiche

// Trasformo in array di oggetti
Object objs[] = anagrafiche.toArray();

// Ordino con merge sort
java.util.Arrays.sort(objs);

// Riempio il mio Vector opportunamente svuotato
anagrafiche.clear();
for(int i = 0; i < objs.length; i++) {
   anagrafiche.add(i, objs[i]);
}
Adesso puoi salvare il file scorrendo il tuo Vector.

Che ne dici???

Ciao