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

Posted

技术标签:

【中文标题】Radix 使用 Java 中的队列对字符串数组进行排序【英文标题】:Radix Sort an array of strings using a queue in Java 【发布时间】:2016-05-01 01:35:40 【问题描述】:

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

每个字符串都有相同数量的字符。我还使用了一个包含队列类的 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;
   

这就是我所拥有的。

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

【问题讨论】:

【参考方案1】:

几乎可以工作了,你只需要向后迭代单词,看第二个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++;
               
           
       

如果你以常规方式迭代它,你会丢失以前的信息,所以最后一个字符是最重要的

祝你好运!

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

for (int len = 0; len &lt; wordLen; len++) 更改为 for (int len = wordLen - 1; len &gt;= 0; len--) 有效,并使我的程序执行应有的操作

【讨论】:

以上是关于Radix 使用 Java 中的队列对字符串数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

Redis 多消费队列方案

Java字节数组转按radix进制输出

数据结构实验四 Radix Sort And Stack

JavaScript中将字符串类型转换为整形的函数

Integer类toString(int i,int radix)方法

Radix Sort base 256 性能