2010-06-10 25 views
0

Je suis étudiant pour un examen qui portera sur les algorithmes de tri. Un ami m'a donné ce code sur LSD Radix Sorting, et je ne comprends pas pourquoi il utilise les numéros 96,97 et 64? J'ai lu quelques petites choses sur le tri par LSD, mais je ne comprenais pas comment cela fonctionne.LSD Radix Code de tri en java

public class LSDRadix { 
    private static String[] list; 

    public static void main(String[] args) throws IOException { 
     Scanner sc = new Scanner(System.in); 
     int n = Integer.parseInt(sc.nextLine().trim()); 

     int size=0; 
     list =new String[n]; 

     for(int i=0; i<n; i++){ 
      list[i]= sc.nextLine(); 

      if(size < list[i].length()){ 
       size = list[i].length(); 
      } 
     } 
     sort(size); 

     for(int j=0; j<n;j++) 
      System.out.println(list[j]); 
    } 

    private static void sort(int sizes){ 
     int numChars = 58; 
     String [] aux = new String[list.length]; 
     int[] counter; 

     for(int i=sizes-1; i>=0 ;i--){  
      counter = new int[numChars]; 

      for(int j=0; j<list.length; j++){ 
       if(list[j].length() > i){ 
        if(list[j].charAt(i) >= 97) 
         counter[list[j].charAt(i)-96]++; 
        else 
         counter[list[j].charAt(i)-64]++; 
       }else{ 
        counter[0]++; 
       } 
      } 

      for(int j=0; j<numChars-1; j++){ 
       counter[j+1] += counter[j]; 
      } 

      for(int j=list.length-1; j>=0; j--){ 
       if(list[j].length() > i){ 
        int pos; 
        if(list[j].charAt(i) >= 97){ 
         pos = list[j].charAt(i)-96; 
        }else{ 
         pos = list[j].charAt(i)-64; 
        } 
        aux[counter[pos]-1] = list[j]; 
        counter[pos]--; 
       }else{ 
        aux[counter[0]-1] = list[j]; 
        counter[0]--; 
       } 
      } 

      for(int j=0; j<list.length; j++){ 
       list[j] = aux[j]; 
      } 
     } 
    } 
} 

Répondre

4

97 est la valeur ASCII de la lettre «a». Si le caractère testé est une lettre minuscule, soustraire 96 de sa valeur ASCII donnera un nombre entre 1 et 26.

Sinon, le caractère est supposé être une lettre majuscule. 65 est la valeur ASCII pour la lettre 'A', donc soustrayant 64 donnera encore une valeur entre 1 et 26.

+3

Deuxième fois aujourd'hui quelqu'un m'a battu au coup de poing répondant à une question par cet OP! C'est une bonne leçon sur pourquoi vous devriez commenter votre code, et aussi pourquoi vous devriez utiliser des constantes nommées. Par exemple, 'int ASCII_VALUE_OF_LOWERCASE_A = 97' au lieu de simplement lancer 97 dans le code tout seul. – Pops

+6

Au lieu d'introduire une constante ASCII_VALUE_OF_LOWERCASE_A, le littéral de caractère '' A'' pourrait être utilisé à la place. –