2010-06-10 44 views
0

我正在研究一個關於排序算法的考試。一位朋友給了我關於LSD基數排序的代碼,我不明白他爲什麼使用96,97和64的數字?我讀過一些關於LSD基數排序的內容,但我不明白它是如何工作的。在java中的LSD基數排序

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]; 
      } 
     } 
    } 
} 

回答

4

97是字母'a'的ASCII值。如果要測試的字符是小寫字母,則從其ASCII值中減去96會得到1到26之間的數字。

否則,該字符被假定爲大寫字母。 65是字母'A'的ASCII值,所以減去64將再次給出1和26之間的值。

+3

第二次今天有人打我回答這個OP的問題!這是你爲什麼要評論你的代碼的一個很好的教訓,也是你爲什麼應該使用命名常量的一個很好的教訓。例如,'int ASCII_VALUE_OF_LOWERCASE_A = 97',而不是僅僅在代碼中拋出97。 – Pops 2010-06-10 20:22:01

+6

而不是引入一個常量'ASCII_VALUE_OF_LOWERCASE_A',而是可以使用字符文字'A'。 – 2010-06-10 20:34:35