2016-05-01 40 views
0

我不完全理解基數排序,因此這使得編寫此程序變得更加困難。我需要對從.txt文件讀取的字符串數組進行排序。我能夠讀取文件並將字符串輸入到數組中。一個字符串可以包含字母或特殊字符。我需要編寫用於排序數組的代碼。這感覺就像我接近有正確的代碼,但我卡住了,不知道還有什麼要做。如果我能得到幫助並指出我朝着正確的方向,我將不勝感激。基數使用Java中的隊列對字符串數組進行排序

每個字符串都有相同數量的字符。我也在使用包含一個隊列類的stackPackage。我需要修改我的教授給我的代碼來對字符串進行排序。

這裏是我開始的代碼:

import queuepackage.*; 

公共類板藍根{

public static void main(String[] args) { 
    int[] array = {143,934,782,687,555,222,111,213,842,2000}; 
    printArray(array); 
    radixSort(array, 1000); 
    printArray(array); 
} 

public static void printArray(int[] array) { 
    for (int i = 0; i < array.length; i++) { 
     System.out.print(array[i] + ", "); 
    } 
    System.out.println(); 
} 

public static void radixSort(int[] array, int maxPowerOf10) { 

    Queue[] queueArray = new Queue[10]; 

    for (int queueNum = 0; queueNum < 10; queueNum++) { 
     queueArray[queueNum] = new Queue(); 
    } 

    for (int powerOf10 = 1; powerOf10 <= maxPowerOf10; powerOf10 = powerOf10 * 10) { 
     for (int item = 0; item < array.length; item++) { 
      int digit = getDigit(array[item], powerOf10); 
      queueArray[digit].enqueue(new Integer(array[item])); 
     } 
     int item = 0; 
     for (int queueNum = 0; queueNum < 10; queueNum++) { 
      while (!queueArray[queueNum].isEmpty()) { 
        array[item] = ((Integer) queueArray[queueNum].dequeue()).intValue(); 
        item++; 
      } 
     } 
    } 
} 

public static int getDigit(int number, int powerOf10) { 
    return (number/powerOf10)%10; 
} 

}

這就是我。

長度=數組的長度

wordLen =字符串數組

在這裏,長度是我目前的基數排序方法的代碼:

public static void radixSort(String[] array, int length, int wordLen) { 
    Queue[] queueArray = new Queue[256]; 
    for (int queueNum = 0; queueNum < 256; queueNum++) { 
     queueArray[queueNum] = new Queue(); 
    } 
    for (int len = 0; len < wordLen; len++) { 
     for (int item = 0; item < length; item++) { 
      int letter = array[item].charAt(len); 
      queueArray[letter].enqueue(new String(array[item])); 
     } 
     int item = 0; 
     for (int queueNum = 0; queueNum < 256; queueNum++) { 
      while (!queueArray[queueNum].isEmpty()) { 
       array[item] = ((String) queueArray[queueNum].dequeue()).toString(); 
       item++; 
      } 
     } 
    } 
} 

回答

0

這幾乎是工作,你只需要向後迭代單詞,看看第二個循環

public static void radixSort(String[] array, int length, int wordLen) { 
    Queue[] queueArray = new Queue[256]; 
    for (int queueNum = 0; queueNum < 256; queueNum++) { 
     queueArray[queueNum] = new Queue(); 
    } 
    for (int len = wordLen-1; len >= 0; len--) { 
     for (int item = 0; item < length; item++) { 
      int letter = array[item].charAt(len); 
      queueArray[letter].enqueue(new String(array[item])); 
     } 
     int item = 0; 
     for (int queueNum = 0; queueNum < 256; queueNum++) { 
      while (!queueArray[queueNum].isEmpty()) { 
       array[item] = ((String) queueArray[queueNum].dequeue()).toString(); // Here you need to swap the 
       item++; 
      } 
     } 
    } 
} 

如果你以正常的方式迭代它,你將失去以前的信息,所以最後的字符是最重要的

祝你好運!

0

我的代碼中唯一可以看到的錯誤是,在RadixSort中,您希望首先按照最低有效位數進行排序,然後隨着時間的推移移動到更重要的位數。但是,在這種情況下,您從左邊開始並向右邊走,這是自然順序字符串排序的錯誤方法。
然而,通過將for (int len = 0; len < wordLen; len++)更改爲for (int len = wordLen - 1; len >= 0; len--)可以很容易地解決這個問題。

+0

是這個工作。非常感謝! – Garret

0

更改for (int len = 0; len < wordLen; len++)for (int len = wordLen - 1; len >= 0; len--)工作,讓我的程序在做什麼是應該

相關問題