Radix使用Java中的队列对字符串数组进行排序

时间:2016-05-01 01:35:41

标签: java arrays sorting radix-sort

我不完全理解基数排序,这使我更难以编写这个程序。我需要对从.txt文件中读取的字符串数组进行排序。我能够读取文件并将字符串输入数组。字符串可以包含字母或特殊字符。我需要帮助编写用于排序数组的代码。感觉我接近拥有正确的代码,但我被困住了,不知道还能做什么。如果我能得到帮助并指出正确的方向,我将不胜感激。

每个字符串具有相同数量的字符。我也在使用包含队列类的stackPackage。我需要修改教授给我的代码来排序字符串。

以下是我开始使用的代码:

import queuepackage.*;

public class Radix {

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

}

这就是我所拥有的。

length =数组的长度

wordLen =数组中字符串的长度

这是我目前的radixSort方法代码:

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

3 个答案:

答案 0 :(得分:0)

它几乎正常工作,你只需要向后迭代这个词,看第二个for循环

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

如果以常规方式迭代它,则会丢失先前的信息,因此最后的字符是最重要的

祝你好运!

答案 1 :(得分:0)

我能看到的代码中唯一的错误是,在RadixSort中,您希望从最低有效数字开始排序,然后随时移动到更高位数。在这种情况下,你是从左边开始向右边走,这是自然顺序字符串排序的错误方法 但是,可以通过将for (int len = 0; len < wordLen; len++)更改为for (int len = wordLen - 1; len >= 0; len--)来轻松解决此问题。

答案 2 :(得分:0)

for (int len = 0; len < wordLen; len++)更改为for (int len = wordLen - 1; len >= 0; len--)有效并使我的程序完成预期