Radixsort算法 - 分散和收集方法

时间:2016-02-15 21:15:09

标签: java algorithm function sorting methods

我有一个分配,我必须读取文件,将每一行作为循环链表中的节点,然后运行scatter()gather()方法。我并没有特别要求任何代码,而是我在查看概念时遇到了麻烦。如果有人可以帮助澄清术语,我会提供给我的指示。 请尽量不提供任何专门给出答案的代码,除非您尝试解释某些内容,因为这是学校作业。

现在我在接下来的两种方法/** * Scatters entries of master list (referenced by instance field masterListReat) * to buckets for a given pass. * * Passes are digit by digit, starting with the rightmost digit - * the rightmost digit is the "0-th", i.e. pass=0 for rightmost digit, pass=1 for * second to rightmost, and so on. * * Each digit is extracted as a character, * then converted into the appropriate numeric value in the given radix * using the java.lang.Character.digit(char ch, int radix) method * * @param pass Pass is 0 for rightmost digit, 1 for second to rightmost, etc */ public void scatter(int pass) { // WRITE YOUR CODE HERE } /** * Gathers all the CLLs in all the buckets into the master list, referenced * by the instance field masterListRear * * @param buckets Buckets of CLLs */ public void gather() { // WRITE YOUR CODE HERE } buckets[]时遇到了问题。以下是我在文件中提供的评论:

null

我已经提供了一系列名为package com.simpleprogrammer; import org.hibernate.Session; import java.util.Date; public class Program { public static void main(String[] args) { System.out.println(org.hibernate.Version.getVersionString()); System.out.println("Creating session!"); Session session = HibernateUtilities.getSessionFactory().openSession(); session.beginTransaction(); User user = new User(); user.setName("Joe"); user.addHistory(new UserHistory(new Date(), "Set the name to Joe")); System.out.println("Name set to Joe!!"); user.getProtienData().setGoal(250); user.addHistory(new UserHistory(new Date(), "Set the goal to 250")); System.out.println("Goal set to 250!!"); session.save(user); System.out.println("Session saved"); session.getTransaction().commit(); System.out.println("Commit done - well done!!"); System.out.println("Beginning transaction!"); session.beginTransaction(); User loadedUser = (User) session.load(User.class, 1); System.out.println("Name of user is " + loadedUser.getName()); System.out.println("Number of goal is " + loadedUser.getProtienData().getGoal()); for(UserHistory history : loadedUser.getHistory()) { System.out.println(history.getEntryTime().toString() + " " + history.getEntry()); } loadedUser.getProtienData().setTotal(loadedUser.getProtienData().getTotal() + 50); loadedUser.addHistory(new UserHistory(new Date(), "Added 50 protein")); System.out.println("Total of user is " + loadedUser.getProtienData().getTotal()); session.getTransaction().commit(); System.out.println("After commit, total of user is " + loadedUser.getProtienData().getTotal()); session.close(); HibernateUtilities.getSessionFactory().close(); } 的循环链接列表,该列表已发送到package com.simpleprogrammer; public class ProtienData { private int total; private int goal; public int getGoal() { return goal; } public void setGoal(int goal) { this.goal = goal; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } 。对我来说令人困惑的部分是每个桶的循环链表的节点。有人可以帮助澄清最后两种方法的可能方向以及它们究竟应该做什么?

感谢。

2 个答案:

答案 0 :(得分:0)

对于scatter()和gather(),bucket []是一个与masterListRear类型相同的数组,bucket []的每个元素都是指向单独循环列表的最后一个节点的指针。

答案 1 :(得分:0)

为了帮助理解基数排序如何工作的概念,让我们描述一下如何使用它来对一副牌进行排序。

以随机顺序开始一副牌。甲板已彻底洗牌,但它整齐的小堆栈。你从卡座上取下顶卡并查看它。这是心中的三个。你完全忽略了这个套装,而只使用了这个数字 - 你把这张卡放在一个为所有3个指定的堆栈中。你拿下一张卡。这是黑桃皇后。它进入以前空的皇后堆栈。你拿下一张牌,3张球杆。你把它放在心中的3个之上。继续这样,直到你经过整个甲板。最后,你将有13个堆栈,每个堆栈包含4个卡,这些卡都具有相同的数字/字母但不同的套装。

上一段对应于您的scatter()功能。

现在你拿起一堆2s然后把它放回主甲板。然后拿起3s并将它们放在2s的顶部。然后将4s放在3s的顶部,然后将5s放在顶部,依此类推,通过国王和王牌。你现在又有一个单一的套牌,在套装方面仍然是完全随机的,但是在数字/字母方面完全有序。

上一段对应于您的gather()功能。

如果你再重复scatter()步骤,但这次有四个套装,并且忽略数字/字母,然后重复gather(),结果将是一个完全有序的套牌。

您的代码应该使用数字而不是卡来执行此操作,每个数字0到9有一个堆栈(或bucket)。pass参数告诉您{{1}的哪个数字通过 - 一位数,十位数,数百,数千等。scatter()不关心gather(),它只是将0桶放在1桶之前,无论涉及哪个数字。