我无法理解基数排序。我应该理清这个词的最后一个字母,比如从右到左排序,直到没有剩下的字母为止。
文本文件如下所示
巴 猫 苹果 窃听器 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);
}
}
答案 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的目的不大基于字母顺序排列的基数排序,除非它是一个概念验证,你可以通过这种方式订购,或者以这种方式专门给你的任务,使你的最终结果只是部分订购。
其次,您在每次迭代后排序的逻辑似乎并不存在。您必须在每次迭代时从每个桶中进行排序,以确保所有内容都按排序顺序排列。