Java

时间:2017-05-03 16:02:01

标签: java sorting data-structures radix-sort

我无法理解基数排序。我应该理清这个词的最后一个字母,比如从右到左排序,直到没有剩下的字母为止。

文本文件如下所示

巴 猫 苹果 窃听器 COG 跳跃 鹿茸 踝 熊

我的输出

踝 鹿茸 苹果 酒吧 熊 窃听器 跳跃 猫 嵌齿

但我应该得到像这样的输出

巴 窃听器 猫 COG 熊 踝 苹果 跳跃 鹿茸

感觉我接近拥有正确的代码,但我被困住了,不知道还能做什么。如果我能得到帮助并指出正确的方向,我将不胜感激

以下是我所做的代码

RadixSort.java

  public class RadixSort {
      public static void main(String[]args) throws FileNotFoundException{
    Linkedlist[] allNameLinkedList = new Linkedlist[26]; // create an array 
        of LinkedList for 26 letters in alphabets
    int count = 0;
    // initialize all the elements in the array to new LinkedList
    for (int i = 0; i < allNameLinkedList.length; i++) {
        allNameLinkedList[i] = new Linkedlist();
    }
    Scanner scan = new Scanner(new File("words.txt"));

    while(scan.hasNextLine())
    {
        String currentname = scan.nextLine();
        for(int i = 0; i < 26; i++){
            if(currentname.charAt(2) == (char)(i+97))
            {
                allNameLinkedList[i].addNodeToTheEndOfTheList(currentname);
            }
        }
        count++;
    }

    // copy sorted nodes to new LinkedList called container
    Linkedlist container = new Linkedlist();
    for (int i = 0; i < 26; i++) {
        Node n = allNameLinkedList[i].front;

        while(n != null){
            container.addNodeToTheEndOfTheList(n.name);
            n = n.next;
        }
    }
    // empty all the elements of array
    for (int i = 0; i < allNameLinkedList.length; i++) {
        allNameLinkedList[i] = new Linkedlist();
    }

    Node m = container.front;
    while(m!=null)
    {
        String currentname = m.name;
        for(int i = 0; i < 26; i++){
            if(currentname.charAt(1) == (char)(i+97))
            {
                allNameLinkedList[i].addNodeToTheEndOfTheList(currentname);
            }
        }
        m = m.next;
        count++;
    }
    container = new Linkedlist();
    for (int i = 0; i < 26; i++) {
        m = allNameLinkedList[i].front;

        while(m!=null){
            container.addNodeToTheEndOfTheList(m.name);
            m = m.next;
        }
    }
    for (int i = 0; i < allNameLinkedList.length; i++) {
        allNameLinkedList[i] = new Linkedlist();
    }
    m = container.front;

    while(m!=null)
    {
        String currentname = m.name;

        for(int i = 0; i < 26; i++){
            if(currentname.charAt(0) == (char)(i+97))
            {
                allNameLinkedList[i].addNodeToTheEndOfTheList(currentname);
            }
        }
        m = m.next;
        count++;
    }
    container = new Linkedlist();
    for (int i = 0; i < 26; i++) {
        m = allNameLinkedList[i].front;

        while(m!=null){
            System.out.println(m.name);
            container.addNodeToTheEndOfTheList(m.name);
            m = m.next;
        }
    }
    scan.close();
    System.out.println("The total number of comparisions was :"+count);
    }
    }

1 个答案:

答案 0 :(得分:0)

你的问题是只排序第一个字符。

while(m!=null)
    {
        String currentname = m.name;

        for(int i = 0; i < 26; i++){
            // charAt(0) is first character in String
            if(currentname.charAt(0) == (char)(i+97)) 
            {
                allNameLinkedList[i].addNodeToTheEndOfTheList(currentname);
            }
        }
        m = m.next;
        count++;
    }

你必须遍历每一个角色,而不仅仅是第一个角色。这解释了为什么您的排序按字母顺序排列。如何以完美的词典顺序超越我。代码片段只会将数据排序到其链接列表中。#34; buckets&#34;基于charAt(0)。

您的输入和输出似乎没有加起来,因为输入是未排序的,并且您的输出实际上是您应该具有的字母基数排序:MSD Radix排序。

最重要的数字是你想要进行字母比较的数字,因为在字典顺序的情况下,较高的比较数字是第一个字符。其他类型可能是LSD(最低有效数字),如整数比较,但是应该警告你LSD Radix排序不足,因为你不得不担心不同长度的字符串。

使用MSD Radix排序,没什么大不了的。你只需要确保你不会超出一个单词的范围,并且在它被放置之后不要移动它,除非它被另一个单词移动。使用LSD,您必须向后索引,在继续使用您的实际charAt current word length - current index > 0排序之前先检查您的charAt(word length - current index),但最终结果可能永远不会按字母顺序排序 - 我认为LSD的目的不大基于字母顺序排列的基数排序,除非它是一个概念验证,你可以通过这种方式订购,或者以这种方式专门给你的任务,使你的最终结果只是部分订购。

其次,您在每次迭代后排序的逻辑似乎并不存在。您必须在每次迭代时从每个桶中进行排序,以确保所有内容都按排序顺序排列。